【发布时间】:2018-03-05 18:03:38
【问题描述】:
我有以下代码,我不能使用setEnabled(false),因为我需要设置背景色和前景色。
public class RadioButton extends JRadioButton implements ItemListener {
public RadioButton(String text)
{
super(text);
addItemListener(this);
}
public void itemStateChanged(ItemEvent e) {
synchronized (this) {
removeItemListener(this);
if (e.getStateChange() == ItemEvent.SELECTED) {
System.out.println("item is selected true [changed]");
setSelected(false);
} else if (e.getStateChange() == ItemEvent.DESELECTED) {
System.out.println("item is selected false [changed]");
setSelected(true);
}
addItemListener(this);
}
}
}
这应该是一个单选按钮,不能更改。但是,如果我尝试测试代码,它会给我一个无限循环打印
item 被选中 true [已更改]
一次...
...然后总是
项目被选中 false [已更改]
直到有一个Java StackOverflowError。
这怎么可能?禁用 ItemListener 是否不起作用?
如果可以的话,请告诉我如何将其打包到 lamda 函数中。在尝试将其放入 lamda 函数时,我收到了 illegal self reference-error。
如果标题不正确,请纠正我。
【问题讨论】:
-
删除可能效果很好,但你也可以在最后添加它
-
@XtremeBaumer 是有意的。因为我调用 setSelected(...) 之前 我再次添加了
ItemListener。 -
一种更简单的解决方案是将
ButtonModel替换为不改变isSelected状态的解决方案 -
我的问题是,为什么?为什么需要一个不能选择但不能禁用的按钮?我问的原因是,作为用户,如果我看到一个在视觉上难以处理但不会改变状态的按钮,我会很生气 - 我认为按钮或程序有问题
-
@MadProgrammer 我有一个程序可以询问考试问题并评估它们。我更改了评估单选按钮和复选框的背景颜色和前景颜色。从上下文中可以清楚地看出,它们并不是要由用户检查,而是代表正确的选择。正如我在问题中解释的那样,如果我使用 setEnabled(false),我无法设置背景色和前景色(灰色调也令人不安)。
标签: java swing events radio-button disabled-control