doClick()和Simon:所有按钮将同时取消,而不是单独按下
嗨,我是stackoverflow的新手,所以如果我犯错误,请耐心等待。
我正在为一个类项目制作这个Java Simon说游戏 。 它通过随机数生成器为每个序列#工作。 我通过doClick()显示序列,但事先删除actionlisteners并在之后添加它。
问题是在按下所有其他按钮之前按钮不会被按下或解除锁定。 我已经尝试使用thread.sleep在每个if … else语句之间设置一个延迟,但它只会持续按下更长时间。 我已经尝试通过try.sleep的try … catch中的repaint(),revalidate(),updateUI()来更新gui,但这也没有用。
我已经意识到这个问题主要是装饰性的,因为当我尝试实现setPressed或setArmed时,它说它没有按下但看起来很紧张。
这是代码片段,它是最简单的forms,没有thread.sleep或我之前的评论尝试。
public void sequence2() //This is where the issue happens. The buttons won't unpress until every button has been pressed. { level.setText(" Level 2"); //Level indicator Green.removeActionListener(Listener); Red.removeActionListener(Listener); Yellow.removeActionListener(Listener); Blue.removeActionListener(Listener); if(sequence1 == 1) { Green.doClick(300); //Programmatically clicks the button } else if(sequence1 == 2) { Red.doClick(300); } else if(sequence1 == 3) { Yellow.doClick(300); } else if(sequence1 == 4) { Blue.doClick(300); } if(sequence2 == 1) { Green.doClick(300); } else if(sequence2 == 2) { Red.doClick(300); } else if(sequence2 == 3) { Yellow.doClick(300); } else if(sequence2 == 4) { Blue.doClick(300); } Green.addActionListener(Listener); Red.addActionListener(Listener); Yellow.addActionListener(Listener); Blue.addActionListener(Listener); }
我是java的新手,所以我不擅长multithreading或以这种方式处理Event Dispatch Thread。 但如果这是唯一的解决方案,我需要更多的帮助。
我有一个zip文件中的完整代码,之前的尝试已经注释掉了,如果这会有所帮助。 https://drive.google.com/file/d/0Bxg4WleC9jD2VFhoZmZBNjV6Vkk/view?usp=sharing
调用doClick()
可能是一个尴尬的选择,因为它在内部使用Timer
。 相反,使用JToggleButton
,它允许您使用setSelected()
根据其selected
状态控制每个按钮的外观。 游戏Buttons
显示了一个完整的示例。 在Swing Timer
的ActionListener
中,选择当前按钮, 播放其音符并递增sequence
索引。 播放完所有音符后,取消选中所有按钮。
附录: 你能说明你如何实现计时器吗?
概括地说,给出了一个合适的切换按钮列表:
private static final int MAX = 4; List buttons = new ArrayList (MAX); private int i;
计时器的监听器可能如下所示:
@Override public void actionPerformed(ActionEvent e) { Object src = e.getSource(); JToggleButton b = buttons.get(i); if (i > MAX) { // reset i and all the buttons for (JToggleButton b : buttons) { b.setSelected(false); } timer.stop(); i = 0; } else { b.setSelected(true); // play tone i i++; } }
切换按钮的项侦听器应更新按钮的外观,如其状态所示:
@Override public void itemStateChanged(ItemEvent e) { JToggleButton b = (JToggleButton) e.getItem(); if (b.isSelected()) { // change icon, color etc. } else { // restore icon, color etc. } }