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和同步线程之间共享的可变数据成员)

如果您删除了所有与实际问题无关的代码,并仅粘贴了相关代码,那么查看发生了什么事情(并亲自尝试)就会容易得多。您可能还会发现,这样做可以解决您自己的问题。对不起,我将清理我的代码。我想知道这是否与我在macos下使用java有关?今晚我将在windows机器上试一试。同时,删除所有不相关的代码不会改变任何事情……这正是我想听到的。如果“裸机”代码工作不正确,那就是史蒂夫·乔布斯的错:)(或者至少有越来越多的证据表明这一点)。。。在windows box上尝试了完整的程序,效果很好。。。谁说窗户有毛病。。。在ImageJ框架中,实际上存在一个名为“isMacOSX()”的方法,这说明了很多问题……我的bug可能是第4项引起的,因为我没有做任何关于线程的特别工作。问题是,这段代码是ImageJ插件的一部分,ImageJ应该处理这个问题。值得一提的是,如果我用JButtons替换按钮,问题就不会出现。lock()告诉ImageJ,imp不可用于任何其他插件来处理它。因此,关于当前运行的插件,图像没有被锁定(我不确定是否完全清楚)。