【问题标题】:Keeping Track of Every Time that a Checkbox is checked and unchecked跟踪复选框被选中和未选中的每次
【发布时间】:2015-07-15 14:46:01
【问题描述】:

我的大部分 java 应用程序已经完成,所以我现在正在记录所有用户活动。我要跟踪的一件事是,无论何时选中和取消选中我的一个复选框。如果对象被选中或未选中,我可以在最后阅读,但是我想知道每次实时使用复选框。我想知道用户选中和取消选中该框的次数。现在我正在使用类似于这种语法的东西,但是每次选中和取消选中复选框时它都不会打印一条语句。

public CheckboxAction(String text) {
    super(text);
}

@Override
public void actionPerformed(ActionEvent event) {
    JCheckBox cbLog = (JCheckBox) event.getSource();
    if (cbLog.isSelected()) {
        System.out.println("Logging is enabled");
    } else {
        System.out.println("Logging is disabled");
    }
}

【问题讨论】:

  • 打印的是什么?每次您选中 on 框时,它是否都不会打印“日志记录已启用”,并且每次您选中 off 框时都不会打印“日志记录已禁用”?
  • 您能否提供一个可运行的示例来演示您的问题...

标签: java swing logging real-time jcheckbox


【解决方案1】:

ItemListener 在这里似乎很合适

yourJCheckBox.addItemListener(new ItemListener() {
    public void itemStateChanged(ItemEvent arg0) {
        if (yourJCheckBox.isSelected()) {
            // Code to execute when it's selected
        }
        else {
            // Code to execute when not selected
        }
    }
});

【讨论】:

    【解决方案2】:

    首先,不要覆盖actionPerformed。如果您需要 - 至少在执行您的操作之前致电super.actionPerformed。最好的方法是使用addActionListener,或者在这种情况下@BoDidely 提到使用addItemListener

    【讨论】:

    • 覆盖actionPerformed有什么危险?如果实现actionListener接口,则必须实现actionPerformed方法。在这种情况下super.actionPerformed 做了什么?
    • 大部分 Swing 组件自己实现了各种侦听器接口供其内部使用。这就是为什么actionPerformed 存在于一个超类中的原因(我认为在这种情况下是JToggleButton)。通过覆盖它而不调用 super 组件的部分功能被遗漏。经验法则是使用add*Listener 方法之一,而不是从超类中覆盖这些类型的方法。
    • 所以我应该在我的回答中调用 super.itemStateChanged() 吗?我不太明白在类级别实现接口与将其用作侦听器或使用匿名类为每个组件提供自己的侦听器之间的区别
    • @BoDidely:你正在实现一个接口,所以super 调用没有任何意义。稍后我会用更多细节更新我的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-10-21
    • 2022-11-10
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多