0

你好,当晚的程序员们,我陷入了道德困境(当然不是道德的,但主要是我不知道该怎么做)。假设我有一个按钮可以执行多项操作,具体取决于所选的菜单项。基本上,我已经想象过这个

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);
4

1 回答 1

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
} );
于 2018-12-23T00:27:30.723 回答