好,所以如果我添加 ActionListener 到GUI元素,这是 只要 我用的元素 ActionListener 在以下几行(a,b)中,我用来获取选定的复选框状态有关系吗?

final JCheckBox checkbox = (JCheckBox)this.buildResult.get("cbDebugTick");
checkbox.addActionListener(new ActionListener() {
    @Override public void actionPerformed(ActionEvent event){               
            boolean bChecked =
            // (a) checkbox.isSelected();
            // (b) ((JCheckBox)event.getSource()).isSelected();
            model.setPrintDebugOn(bChecked);
        }
});

对我来说很有意义的是,如果我添加 ActionListener 反对多个GUI元素,然后我应该使用(b)。

在(b)中,盲目投射可以吗 event.getSource()JCheckBox, ,因为我是添加了动作听众的人,或者我应该在防御上进行编程并执行 instanceof 查看?

笔记: 这个问题是在事件听众一般的背景下; KDGREGORY在下面有一些优点:我忽略了要考虑的复选框。

有帮助吗?

解决方案

在(b)要进行的(b)中,您确实应该进行检查,但这并不重要。我认为这两种行都很好且可以接受,但是(b)将是“更好的代码”

虽然,通常在操作侦听器中完成的操作只需调用在您的复选框中自定义的另一种方法即可。因此看起来像这样:

 @Override public void actionPerformed(ActionEvent event) {                                  
    //your treatment would be in this method, where it would be acceptable to use (a)                  
    onCheckBoxActionPerformed(event)
}

其他提示

我什么都不做。

如果单击复选框要开始采取行动,我将附加 itemListener, ,然后看一下选择状态 itemEvent.

但是,复选框通常不会调用动作,而是管理状态。因此,更好的方法是检查所有复选框,以响应开始动作的任何事情。


编辑:关于OP提出的更大问题的评论。

首先,重要的是要意识到,挥杆的大部分代表实施便利而不是连贯的行为模型。 JCHECKBOXjbutton 除了在其空间内单击是有意义的事实,没有其他共同点。但是,他们俩都继承了 摘要布顿, ,提供实现详细信息,例如按钮的标签。它还假设按钮被“按下”,并且按下按钮将启动一些有意义的行为(动作)。但是,对于jCheckbox,按钮按并不重要,状态的变化是。该状态更改向ItemListener发出了信号 - 即使状态更改对于其他按钮类型毫无意义(Javadoc甚至说“复选框”),它也是在AbstractButton上定义的。

摇摆确实正确的一件事 - 如果难以使用 - 是这样的想法 行动 与启动该动作的控制是分开的。可以从多个控件中调用动作对象:菜单项,对话框上的按钮,键键,等等。从设计的角度来看,更重要的是,它使您摆脱了试图弄清楚需要发生的事情的通用“侦听器”的想法。我已经看到了一个应用程序,例如,一个侦听器从整个菜单系统中接收输入,然后通过一个大的if/else链运行以找出按下哪个菜单项。使用操作意味着您有更多的类,但是从长远来看,您可以为您提供更可维护的应用程序。

最后,从可用性的角度来看,保持状态(例如JCHECKBOX和JTEXTAREA)的控件之间存在差异,以及启动诸如Jbutton和Jmenuitem之类的动作的控件之间存在差异。我已经看到了一个(Web)应用程序,单击单击单击按钮将您带到其他页面。那很糟。即使您打算在内部使用听众,以更新某种模型的状态,您也应该问自己,为什么收集GUI元素本身并不能为您提供模型。

对于听众是独家(例如anon侦听器)的情况,我使用(a)。

如果听众将重复使用(例如, this 是ActionListener的实例)我将其写为:

@Override
public void actionPerformed(ActionEvent event) {
    Object src = event.getSource();
    if (src == checkbox) {
        boolean bChecked = checkbox.isSelected();
        // ...
    }
}

如果您有几个复选框,并且它们以相同的方式处理,则 instanceof 说得通。

我会在防御上进行B型编程,因为它是最佳实践选项。但是,如果只有您要使用代码,那么就没有理由不能做。但是,想象一下,如果您在以后的某个时刻回到一些东西,发现自己编写了好的代码,您会与自己在一起有多快乐,您可以直接重复使用...

许可以下: CC-BY-SA归因
不隶属于 StackOverflow
scroll top