Java:JCheckBox赢得';不要与ItemListener保持联系

Java:JCheckBox赢得';不要与ItemListener保持联系,java,swing,jcheckbox,itemlistener,Java,Swing,Jcheckbox,Itemlistener,好的,我对听众来说是新手(仍在学习这门语言),这是我第一次全面尝试实现它们(不仅仅是教科书中的练习题) 到目前为止,除了一个大错误外,一切正常:复选框没有保持选中状态。我分配给它们的ItemListener运行得很好(我设置了一个JOptionPane来触发它,让我知道它是否工作),但是框本身并没有保持选中状态 我更进一步,添加了条件逻辑,用于判断它的状态是选中还是未选中,并发现当我单击该框时,两种状态都会被触发。所以我得到了两个JOptionPane弹出窗口,一个显示复选框是否选中的消息,另一

好的,我对听众来说是新手(仍在学习这门语言),这是我第一次全面尝试实现它们(不仅仅是教科书中的练习题)

到目前为止,除了一个大错误外,一切正常:复选框没有保持选中状态。我分配给它们的ItemListener运行得很好(我设置了一个JOptionPane来触发它,让我知道它是否工作),但是框本身并没有保持选中状态

我更进一步,添加了条件逻辑,用于判断它的状态是选中还是未选中,并发现当我单击该框时,两种状态都会被触发。所以我得到了两个JOptionPane弹出窗口,一个显示复选框是否选中的消息,另一个显示复选框是否未选中的消息

我在这里包括我的代码。我做错了什么

另外,您会注意到代码具有条件逻辑,可以添加单选按钮或复选框。当程序最终运行时,将以两种格式在多个位置生成此组件。单选按钮工作正常,这是我有上述问题的复选框

创建复选框并分配侦听器的代码:

public OtherField(int voteFor){


            this.voteFor = voteFor;


            otherPanel = new JPanel();
            otherPanel.setLayout(new GridLayout(1, 3));


            otherField = new JTextField(10);
            otherField.setHorizontalAlignment(SwingConstants.CENTER);

            JLabel otherLabel;
            otherLabel = new JLabel("Other", SwingConstants.CENTER);

            otherRadio = new JRadioButton("", false);
            otherRadio.setHorizontalAlignment(SwingConstants.CENTER);
            otherRadio.addActionListener(new OtherFieldRadioListener());

            otherCheckBox = new JCheckBox("");
            otherCheckBox.setHorizontalAlignment(SwingConstants.CENTER);
            otherCheckBox.addItemListener(new OtherFieldCheckBoxListener());

            otherPanel.add(otherLabel);
            otherPanel.add(otherField);

            if(voteFor == 1){
                otherPanel.add(otherRadio);
            }else{
                otherPanel.add(otherCheckBox);
            }



        }
侦听器代码(与上面的代码属于同一类中的私有类):


我要尝试的第一件事是在初始化复选框时将其设置为true或false,即

otherCheckBox.setSelected(false) 

如果这不起作用,我将检查每次选中复选框时是否从其他地方调用OtherField,从而重新绘制组件/重置选择(使用调试器并在OtherFields的开头设置断点)

如何检查是否从其他地方调用它。为了让您了解我的程序的结构,所有这些组件都应该在创建窗口时创建。没有什么应该引起重画的,但话说回来,我不认为自己是个专家,可以排除把事情搞砸的可能性。不管怎样,寻找这个的最佳途径是什么?查看是否有问题的最简单方法是使用调试器。只需在OtherField的开头设置一个断点,然后在调试模式下启动应用程序(我相应地编辑了答案)。好的,我试过了,但没有成功。然后我尝试了一些其他的方法,产生了一个非常奇怪的结果:(哎哟,需要完成这个)所以当我把代码粘贴到这里时,我已经设置好了它,这样当点击一个复选框时,一个JOptionPane会显示它已经被选中。因为我是新的听众,我只想创建一个非常简单的动作,让我知道它是有效的。只是为了见鬼,我将侦听器更改为,而不是创建JOptionPane,而是更改标签的文本。viola,突然间,我的复选框工作正常。JOptionPane是否有可能导致此冲突?@user4076806
确保您正在事件调度线程上创建JOptionPane
-从事件侦听器中执行的代码在EDT上执行,因此不需要使用invokeLater()显示JOptionPane,如此处发布的代码所示。
我在此处包含我的代码
-您随机包含了几行代码,这些代码可能与您的问题有关,也可能与您的问题无关。张贴一个适当的说明问题的帖子。那就是从一个JFrame和一个JCheckBox开始,看看它是否工作。我猜会的。然后添加ItemListener,看看它是否仍然有效。继续添加代码,直到is停止工作,然后隔离导致问题的代码。
otherCheckBox.setSelected(false)