3个按钮的通用动作监听器
Posted
技术标签:
【中文标题】3个按钮的通用动作监听器【英文标题】:Common Action Listener for 3 Buttons 【发布时间】:2013-03-01 12:30:15 【问题描述】:我的代码设计有问题。我有 3 个按钮不在按钮组中。我想 - 基于选定的按钮 - 执行一个动作。现在该操作需要修改类中的对象。这意味着我不能使用内部类,因为它无法访问外部。如果我可以将事件侦听器添加到按钮组,这会容易得多,但正如我所见,我将需要每个单选按钮的事件处理程序,这是正确的吗?如果没有,我还能怎么做?谢谢
一个简单的例子
public class Test()
RadioButton 1 = new RadoButton();
RadioButton 2 = new RadoButton();
RadioButton 3 = new RadoButton();
Object myObject = new Object();
public void clickEvent()
if(1.isSelected())
myObject.doOne();
else if(2.isSelected())
myObject.doTwo();
.....
【问题讨论】:
这句话是错误的:“我不能使用内部类,因为它不能访问外部”,内部类不是静态的。 这是我有生以来第一次看到数字被用作名字! @Ali 只是快速输入:D 【参考方案1】:这是为了说明您如何使用内部类:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JRadioButton;
public class TestInnerClass
JRadioButton radioOne = new JRadioButton();
JRadioButton radioTwo = new JRadioButton();
JRadioButton radioThree = new JRadioButton();
Object myObject = new Object();
public TestInnerClass()
ActionListener myInnerClass = new MyActionListener();
radioOne.addActionListener(myInnerClass);
radioTwo.addActionListener(myInnerClass);
radioThree.addActionListener(myInnerClass);
private class MyActionListener implements ActionListener
@Override
public void actionPerformed(ActionEvent event)
if(radioOne.isSelected()) myObject.toString();
else if(radioTwo.isSelected()) myObject.notify();
else if(radioThree.isSelected()) myObject.getClass().getName();
请注意,内部类不是静态的,正如 gontard 的评论中所述,因此对 myObject 具有可见性。将其保密是最安全的。
在这种情况下,让一个侦听器处理所有事件通常是件好事。但是,在其他情况下,您希望事件处理更具体到每个组件。例如,在这些情况下,radioThree 可能会触发事件,并且由于这些按钮不在一个组中,因此 radioOne 可能仍处于选中状态。这个单一的处理程序将触发并仅在第一个无线电上起作用。解决此问题的一种方法是添加对源的检查,如下所示:
public void actionPerformed(ActionEvent event)
if(event.getSource() == radioOne && radioOne.isSelected())
myObject.toString();
if(event.getSource() == radioTwo && radioTwo.isSelected())
myObject.notify();
if(event.getSource() == radioThree && radioThree.isSelected())
myObject.getClass().getName();
另一种方法是为每个组件使用一个侦听器。这就是匿名类非常方便的地方:
radioOne.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
myObject.doOne();
);
我最喜欢的模式之一,特别是如果工作不平凡,是首先创建一个方法来完成工作,然后从侦听器调用它。我还将调用包装在 SwingUtilities.invokeLater() 中,以从 Swing 事件线程中获取工作。
public class Test
JRadioButton radioOne = new JRadioButton();
Object myObject = new Object();
private void handleRadioOne()
myObject.toString();
// etc, etc.
public Test()
radioOne.addActionListener(new ActionListener()
@Override
public void actionPerformed(ActionEvent e)
SwingUtilities.invokeLater(new Runnable()
@Override
public void run()
handleRadioOne();
);
);
这提供了两个不错的功能:
-
它将您的操作工作封装到一个方法中,以便以后需要时进行编程访问
它确保方法的工作远离 Swing 事件线程,因此您的 GUI 在密集处理期间不会挂起
【讨论】:
【参考方案2】:您可以为所有按钮设置相同的侦听器。
伪代码:
radioButton1 = new RadioButton();
radioButton2 = new RadioButton();
radioButton3 = new RadioButton();
listener = new ActionListener()
...
radioButton1.addActionListener(listener);
radioButton2.addActionListener(listener);
radioButton3.addActionListener(listener);
【讨论】:
我推荐匿名课程。 @Ali 您将不得不键入匿名类的主体 3 次,并且您不会从单一引用中受益。所以匿名类在这个例子中并不好。 @fazomisiek 为什么?一个实现ActionListener
的匿名类可以处理三个单选按钮中的每一个上的事件。以上是关于3个按钮的通用动作监听器的主要内容,如果未能解决你的问题,请参考以下文章