4

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

2 回答 2

2

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

伪代码:

radioButton1 = new RadioButton();
radioButton2 = new RadioButton();
radioButton3 = new RadioButton();

listener = new ActionListener() {
...
}


radioButton1.addActionListener(listener);
radioButton2.addActionListener(listener);
radioButton3.addActionListener(listener);
于 2013-03-13T14:21:47.283 回答
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();
        }
    }
}
  • 请注意内部类如何不是静态的,如 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();
                    }
                });
            }
        });
    }
}

这提供了两个不错的功能:

  1. 它将您的操作工作封装到一个方法中,如果以后需要,可以进行编程访问
  2. 它确保方法的工作远离 Swing 事件线程,因此您的 GUI 不会在密集处理期间挂起
于 2013-03-14T08:51:53.953 回答