在创建难度选择器时遇到问题

时间:2014-08-30 14:11:51

标签: java swing stack-overflow

好的,如果我选择硬,然后选择easy,它会在线程

中给我这个例外
  

AWT-EventQueue-0“java.lang.StackOverflowError

如果您有任何提示/想法,我只想知道它是如何运作的。

以下是代码:

import java.awt.Component;
import java.awt.Container;
import java.awt.event.ItemEvent;
import java.awt.event.ItemListener;

import javax.swing.JCheckBox;
import javax.swing.JFrame;


public class Difficulty extends JFrame {

/**
 * 
 */
private static JCheckBox easy;
private static JCheckBox hard;
private static Container pane;
private Handeler handeler;
private static final long serialVersionUID = 1L;

public Difficulty() {
    super("Select a Difficulty");
    pane = new Container();
    getContentPane().add(pane);
    pane.add(Easy());
    pane.add(Hard());
}

public Component Hard() {
    handeler = new Handeler();
    hard = new JCheckBox("Hard");
    hard.setBounds(60, 40, 60, 50);
    hard.setVisible(true);
    hard.addItemListener(handeler);
    return hard;
}

private Component Easy() {
    handeler = new Handeler();
    easy = new JCheckBox("Easy");
    easy.setBounds(60, 0, 60, 50);
    easy.setVisible(true);
    easy.addItemListener(handeler);
    return easy;
}

public static void main(String[] args) {
    Difficulty gui = new Difficulty();
    gui.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    gui.setLocationRelativeTo(null);
    gui.setSize(200, 200);
    gui.setVisible(true);
    gui.setResizable(false);

}

private class Handeler implements ItemListener {

    @Override
    public void itemStateChanged(ItemEvent item) {

        if(item.getSource() == easy){
            for(int x = 0; x < 1; x++){
                if(hard.isSelected()){
                    hard.setSelected(false);
                    easy.setSelected(true);
                }else {easy.setSelected(true);}
            }

            }else if(item.getSource() == hard){
                for(int x = 0; x < 1; x++){
                if(easy.isSelected()){
                    easy.setSelected(false);
                    hard.setSelected(true);
                }else{hard.setSelected(true);}
                }
            }
        }
}

1 个答案:

答案 0 :(得分:3)

是的,你有一个无限循环。如果您选中复选框,则设置另一个复选框的集合,这会导致该复选框的ItemListener触发,整个循环不断重复。

您不应该使用此类要求的复选框。相反,你应该使用带有ButtonGroup的JRadioButtons。然后,当您选择单选按钮时,将自动取消选择其他按钮。你甚至不需要写一个听众。阅读How to Use RadioButtons上Swing教程中的部分,了解更多信息和工作示例。

另外,作为旁注,你为什么要用ItemListener中的循环编写代码?仅为您单击的按钮生成事件,因此您只需要检查复选框的状态。您不需要更改所单击复选框的状态,这是单击复选框的内置功能的一部分。

最后,请勿使用setBounds(...)。那段代码什么也没做。布局管理器的工作是设置组件的大小和位置。