启用/禁用AWT按钮

时间:2009-11-21 12:58:09

标签: java awt

我写了下面的一段代码,它应该返回一个带有一个复选框和一个按钮的面板。我们的想法是只有选中复选框才能启用该按钮。 它有效,这意味着如果未选中复选框,我尝试按下按钮,则没有任何反应。但是,按钮的视觉外观是错误的,当它显示为启用时显示为禁用,反之亦然。 知道我的代码有什么问题吗? 非常感谢提前

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;
}

3 个答案:

答案 0 :(得分:1)

控制按钮的逻辑是正确的。我修改了您的示例代码,它按照您的描述工作。 (这是我使用的版本:http://pastebin.com/f6cd6cfac,在Sun Java 6上测试过)。

但是,您可以调用其他一些方法,但是您没有向我们展示过:setUseCalibration,imp.unlock和IJ.run。你确定他们回来了吗?您应该从代码中删除外部调用,并将它们一次性添加回来,直到找到导致问题的那个。

答案 1 :(得分:0)

我很确定你正确地做了一切,我的测试证实了这一点。我删除了图像引用和动作代码,按钮的行为与预期一致。

我在Ubuntu Linux上运行Sun的JDK 6。但这不应该有任何区别。

我想知道imp.lock()是否正在做一些令人发指的事情。如果这是与同步和并发处理相关联的那种锁,那么它看起来直观错误,因为你在整个程序的大部分生命周期中都会让穷人被锁定。在任何情况下,您都可以查看在注释操作代码时会发生什么。

答案 2 :(得分:0)

我无法在64位OpenSuse 11.0上使用Sun Java 6重现该问题。但是,这并不意味着代码是正确的。它恰好在我的机器,操作系统和JRE上为我工作。

从你的描述中听起来像button.setEnabled(state)没有更新按钮的外观,所以我想知道在调用之后直接添加一个button.repaint()会使它工作吗?这更像是一个实验,而不是一个解决方案,因为即使它有效,也无法解释为什么你的原始代码会为我运行而不适合你。

无论哪种方式,我怀疑其中一个:

  • 调用代码的方式。
  • 图书馆代码中的东西。
  • JRE中的错误(如果它是Sun JRE,您可以搜索错误 数据库)。
  • 线程问题(确保AWT代码在 EventDispatchThread并在线程之间共享的可变数据成员上进行同步。