Слушатель действий JButton из другого класса

Я работаю с событиями JButton. У меня есть класс JPanel, назовем Panel1, содержащий общедоступную кнопку JButton, назовем ее Button1. При нажатии этой кнопки:

//Inside Panel1
Button1.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e)
   {
      System.out.println("1")
   }
});

Из другого класса JPanel, назовем его Panel2, который содержит Panel1, я должен обработать событие «Button1 Pressed».

//Inside Panel2
Panel1.Button1.addActionListener(new ActionListener() {
   public void actionPerformed(ActionEvent e)
   {
      System.out.println("2")
   }
});

Полученный результат:

2
1

Но мне интересно иметь:

1
2

Любое предложение?


person Redjan    schedule 07.03.2015    source источник
comment
Добавьте прослушиватели действий в обратном порядке: сначала добавьте прослушиватель действий другой панели, затем прослушиватель действий панели.   -  person RealSkeptic    schedule 08.03.2015
comment
@RealSkeptic: нет, это не гарантирует работу. Гарантии заказа в этой ситуации нет. Для исходного постера это выглядит так, как будто вы используете статические поля, и я советую вам не делать этого. Вам, вероятно, придется изменить логику вашей программы, если вы хотите гарантировать порядок. Не уверен насчет других, но мне нужно больше информации о вашей общей проблеме, чтобы помочь.   -  person Hovercraft Full Of Eels    schedule 08.03.2015


Ответы (1)


Если вы добавляете ActionListeners в JButton, вы не можете гарантировать порядок, в котором они будут срабатывать, и знайте, что порядок добавления не гарантирует помощи. Один из способов обойти это — использовать ActionListener для изменения состояния объекта, а затем прослушивать его. Это гарантирует, что сначала сработает ActionListener.

Например, используя PropertyChangeListener в качестве второго слушателя:

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.*;

public class ActionOrder extends JPanel {
   ButtonPanel buttonPanel = new ButtonPanel();
   OtherPanel otherPanel = new OtherPanel();

   public ActionOrder() {
      add(buttonPanel);
      add(otherPanel);

      buttonPanel.addPropertyChangeListener(ButtonPanel.PRESSED, new PropertyChangeListener() {

         @Override
         public void propertyChange(PropertyChangeEvent evt) {
            otherPanel.appendText("Button 1 Pressed");
         }
      });
   }

   private static void createAndShowGui() {
      ActionOrder mainPanel = new ActionOrder();

      JFrame frame = new JFrame("ActionOrder");
      frame.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
      frame.getContentPane().add(mainPanel);
      frame.pack();
      frame.setLocationByPlatform(true);
      frame.setVisible(true);
   }

   public static void main(String[] args) {
      SwingUtilities.invokeLater(new Runnable() {
         public void run() {
            createAndShowGui();
         }
      });
   }
}


class ButtonPanel extends JPanel {
   public static final String PRESSED = "pressed";
   private JButton button1 = new JButton("Button 1");

   public ButtonPanel() {
      add(button1);
      button1.addActionListener(new ActionListener() {

         @Override
         public void actionPerformed(ActionEvent e) {
            System.out.println("1");
            firePropertyChange(PRESSED, null, PRESSED);
         }
      });

      setBorder(BorderFactory.createTitledBorder("Button Panel"));
   }
}

class OtherPanel extends JPanel {
   private JTextArea textArea = new JTextArea(10, 20);

   public OtherPanel() {
      add(new JScrollPane(textArea));
      setBorder(BorderFactory.createTitledBorder("Other Panel"));
   }

   public void appendText(String text) {
      textArea.append(text + "\n");
      System.out.println("2");
      System.out.println();
   }
}
person Hovercraft Full Of Eels    schedule 07.03.2015