【问题标题】:JButton Action Listener from another Class来自另一个类的 JButton 动作侦听器
【发布时间】:2015-05-09 08:11:25
【问题描述】:

我正在处理 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

有什么建议吗?

【问题讨论】:

  • 按相反的顺序添加动作监听器:先添加另一个面板的动作监听器,然后是面板的动作监听器。
  • @RealSkeptic:不,不能保证工作。在这种情况下没有订单保证。对于原始海报,看起来您正在使用静态字段,我建议您不要这样做。如果您想保证顺序,您可能必须更改程序的逻辑。不确定其他人,但我需要有关您的整体问题的更多信息以提供帮助。

标签: java swing jbutton event-listener actionevent


【解决方案1】:

如果将 ActionListener 添加到 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();
   }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-01-04
    相关资源
    最近更新 更多