ActionListener и ActionEvent проблема - PullRequest
0 голосов
/ 24 декабря 2018

У меня возникла техническая проблема с моим ActionListener.Видите ли, у меня есть одна кнопка, которая имеет несколько возможных действий, в зависимости от того, какой MenuItem был нажат ранее.Поэтому я создал ActionListener с ActionEvent e.«e» должен проверять одно из 3 условий (потому что у меня есть 3 MenuItems - Add, Delete и Modify) и в зависимости от того, какой из них выбран, действия, которые происходят, отличаются друг от друга.

проблема в том, что ни одно из условий e.getSource () никогда не проверяется (хотя я несколько раз проверял, что они были. Я застрял на этой проблеме в течение 3 дней, так что, честно говоря, небольшая помощь будет очень кстати!

Тем временем, счастливого Рождества и счастливого Нового года!

 private void buttonValidateActionPerformed(java.awt.event.ActionEvent evt){                                              
    // TODO add your handling code here:
  ActionListener l = (ActionEvent e) -> {
     if(e.getSource()==menuItemAdd)
     {
         System.out.println("eureka!");
         buttonResearch.setEnabled(false);
      if (evt.getSource()== buttonValidate)
        {

        DataTransac dt = new DataTransac();
        dt.ajouterProgrammeurs("...");

        }
     }
     if(e.getSource()==itemDelete)
     {
         if(evt.getSource()== buttonValidate)
         {

        DataTransac dt = new DataTransac();
        dt.deleteProgrammers("...");

         }
     }
     if(e.getSource()==itemModify)
     {
         if(evt.getSource()==buttonValidate)
         {

        DataTransac dt = new DataTransac();
       dt.modifyProgrammeurs("...");

         }
     }


  };

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




  /*

   */

}                                   

Редактировать: я попробовал метод ".equals ()", однако он не сработал.

ActionListener l = (ActionEvent e) -> {
     if(e.equals(menuItemAjouter))
     {
         System.out.println("eureka!");
         buttonResearch.setEnabled(false);
      if (evt.getSource()== buttonValidate)
        {

        DataTransac dt = new DataTransac();

        dt.addProgrammers("...");

        }
        ...

Редактировать 2: После тестирования метода хеширования я случайно наткнулся на странную ошибку: сначала, когда я нажимаю на «Добавить» MenuItem, а затем на кнопку «Проверить», ничего не происходит.Однако, если я нажимаю кнопку «Проверить», затем «Добавить элемент меню, код работает ... Я собираюсь попробовать другие условия.

Ответы [ 2 ]

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

Это очень запутанный вопрос.

Я начну с того, что использование getSource обычно плохая идея.Это связывает это действие с компонентом - именно те проблемы слушателей были введены, чтобы уйти от них.Это похоже на возврат к JDK 1.00, и никто этого не хочет, только теперь мы добавили дополнительные сложности.Также Swing склонен использовать составные компоненты (это шаблон проектирования Composite).

Давайте посмотрим на ваш код.

private void buttonValidateActionPerformed (java.awt.event.ActionEvent evt) {
// TODO добавьте ваш код обработки здесь: ActionListener l = (ActionEvent e) -> {

Что здесь происходит.Пожалуйста, встаньте, слушатель реальных действий.Поместите несколько printfs (или используйте отладчик), чтобы убедиться, что поток управления соответствует ожидаемому.

 if(e.getSource()==menuItemAdd)
 {
     System.out.println("eureka!");
     buttonResearch.setEnabled(false);
  if (evt.getSource()== buttonValidate)

Я предполагаю, что вы также написали.

buttonValidate = menuItemAdd;

Стоит проверить у слушателя, правильно ли все настроено.Попробуйте несколько printfs вверху.

System.err.println("e.getSource(): "+System.identityHashCode(e.getSource());
System.err.println("buttonValidate: "+System.identityHashCode(buttonValidate));
System.err.println("menuItemAdd: "+System.identityHashCode(menuItemAdd));
System.err.println("itemDelete: "+System.identityHashCode(itemDelete));
System.err.println("itemModify: "+System.identityHashCode(itemModify));

Если вы где-то испортили какое-то назначение, это должно появиться как неожиданные хэш-коды объекта.

Я предлагаю вернуть код и добавитьодин слушатель действия за действие.Вам не нужны эти if заявления повсюду.Внутри каждого слушателя они могут при необходимости проверить состояние.

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

У меня есть одна кнопка с несколькими возможными действиями, в зависимости от того, какой MenuItem был нажат ранее.

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

Поток управления в вашем GUI мне не совсем понятен, но ваши альтернативы делятся на несколько категорий:

  • Используйте разные кнопки вместо того, чтобы делать то же самоеодин отвечает за различные действия.
  • Если вы хотите продолжить настройку какого-либо режима с помощью элементов меню, тогда сохранит текущий режим в некоторой общей переменной, доступной для обработчика событий кнопки,и пусть он использует его вместо источника действия.
  • Или, возможно, попросите ваши пункты меню изменить, какой из нескольких целевых ActionListener s установлен на кнопке, так что выбор эффекта может быть обусловленСлушатель вызвал.

Любой из первых двух гораздо предпочтительнее последнего, который я предлагаю в основном для полноты.

...