gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 22:44:10 24 4
gpt4 key购买 nike

好吧,如果我选择困难然后选择简单,它就会在线程中给我这个异常

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);}
}
}
}
}

最佳答案

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

您不应该针对此类要求使用复选框。相反,您应该将 JRadioButtons 与 ButtonGroup 一起使用。然后,当您选择一个单选按钮时,另一个按钮将自动取消选择。您甚至不需要编写监听器。阅读 Swing 教程中关于 How to Use RadioButtons 的部分了解更多信息和工作示例。

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

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

关于java - 创建难度选择器时遇到问题,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/25583265/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com