Java 启用/禁用AWT按钮
我编写了下面的代码,它应该返回一个带有一个复选框和一个按钮的面板。其想法是,只有选中复选框时,才应启用该按钮。 它是有效的,这意味着如果复选框没有被选中,我试着按下按钮,什么也不会发生。但是,按钮的视觉外观是错误的,当按钮应显示为已启用时,它显示为已禁用,反之亦然。 知道我的代码有什么问题吗? 提前多谢Java 启用/禁用AWT按钮,java,awt,Java,Awt,我编写了下面的代码,它应该返回一个带有一个复选框和一个按钮的面板。其想法是,只有选中复选框时,才应启用该按钮。 它是有效的,这意味着如果复选框没有被选中,我试着按下按钮,什么也不会发生。但是,按钮的视觉外观是错误的,当按钮应显示为已启用时,它显示为已禁用,反之亦然。 知道我的代码有什么问题吗? 提前多谢 public Panel createCalibrationPanel(final ImagePlus imp) { final Panel panel = new Panel();
public Panel createCalibrationPanel(final ImagePlus imp) {
final Panel panel = new Panel();
panel.setLayout(new BoxLayout(panel, BoxLayout.LINE_AXIS));
panel.add(Box.createHorizontalStrut(20));
final Checkbox checkbox = new Checkbox(
"Use image spatial calibration for q scale", true);
final Button button = new Button("Set scale");
useCalibration = checkbox.getState();
button.setEnabled(checkbox.getState());
panel.add(checkbox);
panel.add(button);
checkbox.addItemListener(new ItemListener() {
public void itemStateChanged(final ItemEvent e) {
boolean state = checkbox.getState();
setUseCalibration(state);
button.setEnabled(state);
}
});
button.addActionListener(new ActionListener() {
public void actionPerformed(final ActionEvent e) {
imp.unlock();
IJ.run(imp, "Set Scale...", "");
imp.lock();
}
});
return panel;
}
我很确定你做的一切都是正确的,我的测试证明了这一点。我删除了图像参考和操作代码,按钮的行为符合预期 我正在Ubuntu Linux上运行Sun的JDK 6。但这不应该有任何区别
我想知道小鬼锁()是否做了什么令人发指的事。如果这是一种与同步和并发处理相关联的锁,那么从直觉上看它是错误的,因为在程序生命周期的大部分时间里,您都在锁定可怜的imp。在任何情况下,您都可以查看注释操作代码时发生的情况。控制按钮的逻辑是正确的。我修改了您的示例代码,它按照您描述的那样工作。(这是我使用的版本:,在Sun Java 6上测试)
但是,您还调用了一些其他方法,但您没有向我们展示这些方法:setUseCalibration、imp.unlock和IJ.run。你确定他们返回正确吗?您应该从代码中删除外部调用,然后一次将它们添加回一个,直到找到导致问题的外部调用。我也无法在64位OpenSuse 11.0上使用Sun Java 6重现该问题。然而,这并不意味着代码是正确的。今天,它正好在我的机器、OS和JRE上工作 根据您的描述,它听起来像是button.setEnabled(state)没有更新按钮的外观,所以我想知道在调用之后直接添加button.repaint()是否可以让它工作?这与其说是一个解决方案,不如说是一个实验,因为即使它有效,也不能解释为什么原始代码为我而不是为你运行 无论哪种情况,我都怀疑:
- 调用代码的方式中的某些东西
- 库代码中的某些内容
- JRE中的bug(如果是Sun JRE,您可以搜索bug) 数据库)
- 线程问题(请确保AWT代码在 EventDispatchThread和同步线程之间共享的可变数据成员)