我的代码设计遇到了问题。我有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();
}.....
}
}
答案 0 :(得分:2)
您可以为所有按钮设置相同的侦听器。
伪代码:
radioButton1 = new RadioButton();
radioButton2 = new RadioButton();
radioButton3 = new RadioButton();
listener = new ActionListener() {
...
}
radioButton1.addActionListener(listener);
radioButton2.addActionListener(listener);
radioButton3.addActionListener(listener);
答案 1 :(得分:2)
这是为了说明如何使用内部类:
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();
}
}
}
让一个侦听器处理所有事件通常很好,就像在这种情况下一样。但是,在其他情况下,您希望事件处理对每个组件更具体。例如,在这些情况下,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 Event Thread中获取工作。
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();
}
});
}
});
}
}
这提供了两个不错的功能: