Java 3个按钮的通用操作侦听器
我的代码设计有问题。我有3个按钮不在一个按钮组中。我想根据所选按钮执行一项操作。现在,该操作需要修改类中的对象。这意味着我不能使用内部类,因为它不能访问外部类。如果我可以向按钮组添加一个事件侦听器,这会容易得多,但在我看来,每个单选按钮都需要一个事件处理程序,对吗?如果没有,我还能怎么做?谢谢 一个简单的例子Java 3个按钮的通用操作侦听器,java,swing,radio-button,awt,mixing,Java,Swing,Radio Button,Awt,Mixing,我的代码设计有问题。我有3个按钮不在一个按钮组中。我想根据所选按钮执行一项操作。现在,该操作需要修改类中的对象。这意味着我不能使用内部类,因为它不能访问外部类。如果我可以向按钮组添加一个事件侦听器,这会容易得多,但在我看来,每个单选按钮都需要一个事件处理程序,对吗?如果没有,我还能怎么做?谢谢 一个简单的例子 public class Test(){ RadioButton 1 = new RadoButton(); RadioButton 2 = new RadoButton(
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();
}.....
}
}
您可以为所有按钮设置相同的侦听器 伪代码:
radioButton1 = new RadioButton();
radioButton2 = new RadioButton();
radioButton3 = new RadioButton();
listener = new ActionListener() {
...
}
radioButton1.addActionListener(listener);
radioButton2.addActionListener(listener);
radioButton3.addActionListener(listener);
这是为了说明如何使用内部类:
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具有可见性。保密是最安全的
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();
}
});
}
});
}
}
这提供了两个很好的功能:
这种说法是错误的:“我不能使用内部类,因为它不能访问外部类”,而内部类不是静态的。这是我有生以来第一次看到数字用作名称@Ali只是快速输入:我推荐匿名类。@Ali您必须输入匿名类主体3次,并且您不会从单个引用中受益。所以在这个例子中匿名类并不好。@fazomisiek为什么?一个实现
ActionListener
的匿名类可以处理三个单选按钮中每个按钮上的事件。