我写了下面的一段代码,它应该返回一个带有一个复选框和一个按钮的面板。我们的想法是只有选中复选框才能启用该按钮。 它有效,这意味着如果未选中复选框,我尝试按下按钮,则没有任何反应。但是,按钮的视觉外观是错误的,当它显示为启用时显示为禁用,反之亦然。 知道我的代码有什么问题吗? 非常感谢提前
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;
}
答案 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()会使它工作吗?这更像是一个实验,而不是一个解决方案,因为即使它有效,也无法解释为什么你的原始代码会为我运行而不适合你。
无论哪种方式,我怀疑其中一个: