Java开发疑问:单个ItemListener处理双Choice组件时的事件判断依据及ItemEvent方法返回值
解决你的桌游玩家类型设置监听器问题
嘿,我来帮你理清这个监听器的判断逻辑问题,顺便先提一下你初始化代码里的小bug,避免后续踩坑~
先修正初始化代码的错误
你写的addChoosers()里有两处明显的错误,会导致界面显示异常:
void addChoosers(){ JPanel _choosers = new JPanel(); // 绿色玩家部分:你把_green的组件错写成了_blue _choosers.add(new JLabel("Green")); _green = new Choice(); _green.add("Man"); _green.add("Machine"); _choosers.add(_green); // 原代码是_choosers.add(_blue); 这里要改成_green // 蓝色玩家部分:逻辑是对的,但别忘加监听器 _choosers.add(new JLabel("Blue")); _blue = new Choice(); _blue.add("Man"); _blue.add("Machine"); _choosers.add(_blue); }
核心疑问的解答:判断条件怎么写?
1. e.getItem()的返回值
没错,e.getItem()确实会返回你添加的选项字符串——也就是"Man"或者"Machine",但千万不要用==比较字符串!==比较的是对象的内存引用,而字符串内容相等应该用equals()方法,比如"Man".equals(e.getItem()),这是Java新手很容易踩的坑。
2. e.getSource()的返回值
e.getSource()返回的是触发事件的组件对象本身,不是"Green"这类字符串。比如绿色玩家的Choice触发事件时,它返回的就是你创建的_green实例;蓝色的就是_blue实例。所以你可以通过判断这个对象来区分是哪个颜色的玩家设置。
完整的监听器实现示例
结合这两个判断条件,你可以写出清晰的逻辑:
public class PlayerListener implements ItemListener{ // 如果这个监听器是外部类,需要把_green和_blue传进来,比如通过构造方法 private final Choice greenChoice; private final Choice blueChoice; public PlayerListener(Choice green, Choice blue) { this.greenChoice = green; this.blueChoice = blue; } @Override public void itemStateChanged(ItemEvent e) { String selectedOption = (String) e.getItem(); // 先判断是哪个颜色的Choice触发了事件 if (e.getSource() == greenChoice) { // 处理绿色玩家的设置 if ("Machine".equals(selectedOption)) { // 这里写设置绿色机器玩家回合顺序的逻辑 System.out.println("绿色玩家设为机器,调整回合顺序"); } // 选Man的话不操作,符合你的需求 } else if (e.getSource() == blueChoice) { // 处理蓝色玩家的设置 if ("Machine".equals(selectedOption)) { // 这里写设置蓝色机器玩家回合顺序的逻辑 System.out.println("蓝色玩家设为机器,调整回合顺序"); } } } }
然后在初始化方法里给每个Choice绑定监听器:
void addChoosers(){ JPanel _choosers = new JPanel(); // 绿色玩家 _choosers.add(new JLabel("Green")); _green = new Choice(); _green.add("Man"); _green.add("Machine"); _choosers.add(_green); // 绑定监听器,传入_green和_blue _green.addItemListener(new PlayerListener(_green, _blue)); // 蓝色玩家 _choosers.add(new JLabel("Blue")); _blue = new Choice(); _blue.add("Man"); _blue.add("Machine"); _choosers.add(_blue); _blue.addItemListener(new PlayerListener(_green, _blue)); }
总结判断逻辑的核心
- 用
e.getSource()区分哪个颜色的玩家设置(对应具体的Choice组件实例) - 用
e.getItem()结合equals()判断选中的是Man还是Machine
这样就能准确识别每个Choice的操作,然后让控制器正确设置机器玩家的回合顺序啦~
内容的提问来源于stack exchange,提问作者OBSC
相关产品推荐
相关产品推荐

