【问题标题】:Disable actionListener for JComboBox (when using anonymous class)禁用 JComboBox 的 actionListener(使用匿名类时)
【发布时间】:2018-09-04 22:31:57
【问题描述】:

我将 actionListener 与 JComboBox 事件一起使用。当我手动设置程序中选择的项目时,我想禁用监听器。

在这里你可以看到这个-

String item=null;
String isSetByProgram=false;

jcb1.addActionListener(new ActionListener() {
    public void actionPerformed(ActionEvent ae){
                if(isSetByProgram)
                    return;
                item=jcb1.setSelectedItem();
        }
    });

    //Now set by program
    isSetByProgram = true;
    jcb1.setSelectedItem("customItem1");
    isSetByProgram=false;

但在这里我得到了这个:

错误:从内部类引用的局部变量必须是最终的或实际上是最终的

如何在不创建另一个扩展 JComboBox 的单独类的情况下做到这一点?

【问题讨论】:

    标签: java swing events awt jcombobox


    【解决方案1】:

    itemisSetByProgram 移动到您班级的私有字段。实例字段专门用于存储状态。

    public class MyApplication {
        private boolean isSetByProgram;
        private String item;
    
        // ...
    
            jcb1.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae){
                    if (isSetByProgram) {
                        return;
                    }
                    item = jcb1.getSelectedItem();
                }
            });
    
            //Now set by program
            isSetByProgram = true;
            jcb1.setSelectedItem("customItem1");
            EventQueue.invokeLater(() -> { isSetByProgram = false; });
    

    【讨论】:

    • 为什么 EventQueue.invokeLater(() -> { isSetByProgram = false; });写了吗??
    • 因为调用 jcb1.setSelectedItem 会将事件放在 AWT 事件队列中。如果立即执行isSetByProgram = false;,则可能在触发ActionListener 之前为false。这样,您可以确保在处理完 ActionEvent 后将其设置为 false。
    【解决方案2】:

    据我所知,你不能。这是因为您的匿名类在变量的副本上工作,该变量(如果不是最终的)可以更改,在这种情况下是不允许的。

    【讨论】:

    • 我尝试使用 final 但最终你无法在使用 final 时更改值
    • 是的,final 就是这样工作的,如果它是对象引用,则不能更改 final 变量值或最终引用。
    • 您还知道其他方法吗?
    • 您可以尝试编写一个具有参数 isSetByProgram 的类。从中创建对象并将对该对象的最终引用发送到匿名类。这个对象不会改变,但它的值可以改变。它应该可以工作(我还没有测试过)。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-04-26
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多