这是为了说明如何使用内部类:
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 不会在密集处理期间挂起