对ActionListener感到困惑

时间:2018-12-23 00:09:02

标签: button actionlistener actionevent menu-items

你好,当晚的编码员, 我陷入道德困境(不是道德困境,但大多数情况下我不知道该怎么做)。 假设我有一个按钮可以执行多个操作,具体取决于所选择的菜单项。 基本上,我已经想象过了

private void menuButtonActionPerformed(ActionEvent b)
ActionEvent a 
if(a.getSource()==menuItem)
  if(b.getSource()==button)
    do this and that

这是正确的方法吗?因为如果是这样,我必须在menuItem上添加ActionListeners,但是我在某些地方会遇到一些愚蠢的错误代码!

预先感谢您的帮助!

Post Scriptum:@David,我已经尝试过了,但是初始条件尚未得到验证。

   private void buttonValidateActionPerformed(java.awt.event.ActionEvent evt)
   ActionListener l = (ActionEvent e) -> {
     if(e.getSource()==menuItemAdd)
     {
         System.out.println("eureka!");
         buttonSearch.setEnabled(false);
      if (evt.getSource()==buttonValidate)
        {

        DataTransac dt = new DataTransac();

        dt.addCoders("...");
        }
     }
     if(e.getSource()==itemDelete)
     {
        DataTransac dt = new DataTransac();
        dt.deleteCoders("...");
     }

  };

  menuItemAdd.addActionListener(l);
  itemDelete.addActionListener(l);

1 个答案:

答案 0 :(得分:0)

那行不通;每次使用该侦听器时,您的侦听器将获得不同的调用-因此事件源将是单个调用的按钮或菜单项。

您需要使用一个存储状态的ActionListener响应菜单项,然后分别处理按钮动作。您可以使用一个侦听器来执行此操作,但我不会;我会这样做:

private MenuItem selected;

private class MenuItemListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        // if you really want to have one listener for multiple menu items,
        // continue with the .getSource() strategy above, but store some
        // state outside the listener
        selected = (MenuItem)event.getSource();

        // you could alternatively have a different listener for each item
        // that manipulates some state
    }
}

private class ButtonListener implements ActionListener {
    public void actionPerformed(ActionEvent event) {
        // take conditional action based on selected menu item, as you describe
        // in the question
    }
}

void setup() {
    JMenuItem first = /* ... */;
    JMenuItem second = /* ... */;

    MenuItemListener listener = new MenuItemListener();
    first.addActionListener(listener);
    second.addActionListener(listener);

    JButton button = /* ... */;
    button.addActionListener(buttonListener);
}

通常来说,这是首选方法-对每个语义动作使用不同的侦听器,而不是对源进行内省的侦听器。您的代码将更简洁,更容易理解。

出于相同的原因,某些人更喜欢对Java事件侦听器使用匿名类。这是一个要点,其中显示了几种语法:https://gist.github.com/sfcgeorge/83027af0338c7c34adf8。如果您使用Java 8或更高版本,我个人更喜欢:

button.addActionListener( event -> {
    // handle the button event
} );