3个按钮的常用动作监听器

我的代码设计有问题。 我有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(); }..... } } 

您可以为所有按钮设置相同的侦听器。

伪代码:

 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。 保持私密是最安全的。

让一个侦听器处理所有事件通常很好,就像在这种情况下一样。 但是,在其他情况下,您希望事件处理对每个组件更具体。 例如,在这些情况下,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(); } }); } }); } } 

这提供了两个不错的function:

  1. 它将您的操作工作封装到一个方法中,以便在以后需要时进行编程访问
  2. 它确保方法的工作不在Swing Event Thread中,因此在密集处理期间GUI不会挂起
Interesting Posts