itemStateChanged中的removeEvent ItemListener(removeItemListener)不起作用(StackOverfowError)

问题描述 投票:0回答:2

我有以下代码,我不能使用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。

如果标题不正确,请纠正我。

java swing events radio-button disabled-control
2个回答
0
投票

正如illegal self reference指出的那样,通过将MadProgrammer设置为一个始终返回恒定值的自定义值,可以实现禁用AbstractButton(aka RadioButtonCheckbox)。

MainClass:

ButtonModel

ButtonCustomModel:

radioButtonOrCheckbox.setModel(new ButtonCustomModel(true));

0
投票

我不能使用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

Disabled CheckBox and RadioButton

现在,这只是一个快速的黑客攻击。

对我来说,我可能会考虑做一些不同的事情,以突出正确的答案,可能消失或删除其他问题或使用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和漂亮的大绿色刻度线或红十字,作为一些简单的想法关闭我的头顶。

© www.soinside.com 2019 - 2024. All rights reserved.