我有以下代码,我不能使用setEnabled(false)
,因为我需要设置background-和foregroundcolor。
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);
}
}
}
这应该是一个无法更改的单选按钮。无论如何,如果我尝试测试代码,它会给我一个无限循环打印
项目被选中为真[已更改]
一旦...
......然后总是
项目被选中false [已更改]
直到有一个Java StackOverflowError
。
怎么会这样?禁用ItemListener是否无效?
如果你还可以请告诉我,如何将其打包成lambda函数。当我尝试将它放入lamda函数时,我得到了一个qazxsw poi-error。
如果标题不正确,请纠正我。
正如illegal self reference
指出的那样,通过将MadProgrammer设置为一个始终返回恒定值的自定义值,可以实现禁用AbstractButton
(aka RadioButton
或Checkbox
)。
MainClass:
ButtonModel
ButtonCustomModel:
radioButtonOrCheckbox.setModel(new ButtonCustomModel(true));
我不能使用setEnabled(false),因为我需要设置background-和foregroundcolor
这可能仅仅是个人的事情,但我有一个明显的不喜欢或UI不符合建立规范和用户期望。
因此,当不应该与按钮进行交互时,应该禁用它。这是用户立即理解的约定。
我更改了评估 - radiobuttons和-checkbox的背景颜色和前景色。
好的,所以你想以某种方式装饰按钮,足够公平
从上下文中可以清楚地看出,它们并不意味着用户进行检查
或许,对于你,我可能会疯狂地试图点击它,但我只是那种用户;)
好吧,所以只需要一点点就可以使用public class ButtonModel implements javax.swing.ButtonModel {
protected boolean state;
public ButtonModel(boolean state)
{
this.state = state;
}
@Override
public boolean isSelected() {
return state;
}
@Override
public boolean isEnabled() {
return true;
}
// other methods of ButtonModel-interface
[...]
}
的默认值,可以更好地控制某些元素的渲染方式,例如......
UIManager
现在,这只是一个快速的黑客攻击。
对我来说,我可能会考虑做一些不同的事情,以突出正确的答案,可能消失或删除其他问题或使用UIManager.put("RadioButton.disabledText", Color.BLUE);
JRadioButton rb = new JRadioButton("Test");
rb.setOpaque(true);
rb.setBackground(Color.RED);
rb.setForeground(Color.BLUE);
rb.setEnabled(false);
add(rb);
UIManager.put("CheckBox.disabledText", Color.RED);
JCheckBox cb = new JCheckBox("Test");
cb.setOpaque(true);
cb.setBackground(Color.BLUE);
cb.setForeground(Color.RED);
cb.setEnabled(false);
add(cb);
突出正确的答案或使用LineBorder
和漂亮的大绿色刻度线或红十字,作为一些简单的想法关闭我的头顶。