禁用 JComboBox 的 actionListener(使用匿名 class 时)
Disable actionListener for JComboBox (when using anonymous class)
我正在将 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;
但是我得到了这个:
错误:从内部 class 引用的局部变量必须是最终的或实际上是最终的
如果不创建另一个扩展 JComboBox 的单独 class,我如何才能做到这一点?
据我所知你不能。这是因为您的匿名 class 作用于可以更改的变量副本(如果不是最终的),在这种情况下这是不允许的。
将 item
和 isSetByProgram
移动到您 class 的私有字段。实例字段专门用于存储状态。
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; });
我正在将 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;
但是我得到了这个:
错误:从内部 class 引用的局部变量必须是最终的或实际上是最终的
如果不创建另一个扩展 JComboBox 的单独 class,我如何才能做到这一点?
据我所知你不能。这是因为您的匿名 class 作用于可以更改的变量副本(如果不是最终的),在这种情况下这是不允许的。
将 item
和 isSetByProgram
移动到您 class 的私有字段。实例字段专门用于存储状态。
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; });