How does the 'actionPerformed' method get called without an explicit call to it?

后端 未结 2 1656
暗喜
暗喜 2021-02-19 22:11

I just started learning GUI with Swing and don\'t exactly understand how the actionPerformed method works. Consider the following code:

//code to cr         


        
2条回答
  •  你的背包
    2021-02-19 22:49

    But there is a specific call to this method, only it's not occurring in your code but rather in the JVM. A button push instigates internal events that leads the JVM to tell the button to notify all of its listeners that it has been pushed. This will cause the actionPerformed methods of all attached ActionListeners to be called.

    To see information on how this works, first look at the Java API for the AbstractButton class where you'll find the method

    protected void fireActionPerformed(ActionEvent event)
    

    Where

    Notifies all listeners that have registered interest for notification on this event type. The event instance is lazily created using the event parameter.

    Then for further information, you will want to go beyond the Java API to the source code which can be found here. If you check out the Java 8.0 source code there, and look up javax then swing, then AbstractButton, you'll find a fireActionPerformed(ActionEvent event) method:

    2002    protected void More ...fireActionPerformed(ActionEvent event) {
    2003        // Guaranteed to return a non-null array
    2004        Object[] listeners = listenerList.getListenerList();
    2005        ActionEvent e = null;
    2006        // Process the listeners last to first, notifying
    2007        // those that are interested in this event
    2008        for (int i = listeners.length-2; i>=0; i-=2) {
    2009            if (listeners[i]==ActionListener.class) {
    2010                // Lazily create the event:
    2011                if (e == null) {
    2012                      String actionCommand = event.getActionCommand();
    2013                      if(actionCommand == null) {
    2014                         actionCommand = getActionCommand();
    2015                      }
    2016                      e = new ActionEvent(AbstractButton.this,
    2017                                          ActionEvent.ACTION_PERFORMED,
    2018                                          actionCommand,
    2019                                          event.getWhen(),
    2020                                          event.getModifiers());
    2021                }
    2022                ((ActionListener)listeners[i+1]).actionPerformed(e);
    2023            }
    2024        }
    2025    }
    

提交回复
热议问题