来自另一个类的 JButton 动作侦听器
Posted
技术标签:
【中文标题】来自另一个类的 JButton 动作侦听器【英文标题】:JButton Action Listener from another Class 【发布时间】: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:不,不能保证工作。在这种情况下没有订单保证。对于原始海报,看起来您正在使用静态字段,我建议您不要这样做。如果您想保证顺序,您可能必须更改程序的逻辑。不确定其他人,但我需要有关您的整体问题的更多信息以提供帮助。 【参考方案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();
【讨论】:
以上是关于来自另一个类的 JButton 动作侦听器的主要内容,如果未能解决你的问题,请参考以下文章
如果JTextField的文档为空,如何指定JButton状态[重复]