Запутался в ActionListeners - PullRequest
       96

Запутался в ActionListeners

0 голосов
/ 23 декабря 2018

Привет, товарищи по ночной работе, я застрял с моральной дилеммой (ну, не морально, но в основном я не знаю, что делать).Предположим, у меня есть одна кнопка, которая может выполнять несколько действий, в зависимости от выбранного пункта меню.По сути, я представлял себе это

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

Это правильный способ сделать это?потому что, если это так, мне придется добавить ActionListeners в menuItem, но я застрял с каким-то глупым кодом ошибки!

Заранее спасибо за помощь!

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 голосов
/ 23 декабря 2018

Это не сработает;Ваш слушатель будет получать разные вызовы при каждом его использовании, поэтому источником события будет либо кнопка, либо пункт меню для одного вызова.

Вам нужно будет ответить на этот пункт меню.с одним 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.Вот Gist, который показывает несколько синтаксисов: https://gist.github.com/sfcgeorge/83027af0338c7c34adf8. Я лично предпочитаю, если вы на Java 8 или выше:

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