好的,如果我选择硬,然后选择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);}
}
}
}
}
答案 0 :(得分:3)
是的,你有一个无限循环。如果您选中复选框,则设置另一个复选框的集合,这会导致该复选框的ItemListener触发,整个循环不断重复。
您不应该使用此类要求的复选框。相反,你应该使用带有ButtonGroup的JRadioButtons。然后,当您选择单选按钮时,将自动取消选择其他按钮。你甚至不需要写一个听众。阅读How to Use RadioButtons上Swing教程中的部分,了解更多信息和工作示例。
另外,作为旁注,你为什么要用ItemListener中的循环编写代码?仅为您单击的按钮生成事件,因此您只需要检查复选框的状态。您不需要更改所单击复选框的状态,这是单击复选框的内置功能的一部分。
最后,请勿使用setBounds(...)
。那段代码什么也没做。布局管理器的工作是设置组件的大小和位置。