嗨,我是stackoverflow的新手,所以如果我犯错误,请耐心等待。
我正在为一个课程项目制作 Java Simon说游戏。它通过随机数生成器为每个序列#工作。我通过 doClick()显示序列,但事先删除actionlisteners并在之后添加它。
问题是按钮在按下所有其他按钮之前不会按下或解除按钮。我已经尝试使用thread.sleep在每个if ... else语句之间加一个延迟,但它只会持续按下更长时间。我已经尝试通过try.sleep的try ... catch中的repaint(),revalidate(),updateUI()来更新gui,但这也没有用。
我已经意识到这个问题主要是装饰性的,因为当我尝试实现setPressed或setArmed时,它说它没有按下但看起来很紧张。
以下是代码片段,它是最简单的形式,没有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的新手,所以我不擅长多线程或以这种方式处理事件调度线程。但如果这是唯一的解决方案,我需要更多的帮助。
我在zip文件中有完整的代码,之前的尝试已注释掉是否有帮助。 https://drive.google.com/file/d/0Bxg4WleC9jD2VFhoZmZBNjV6Vkk/view?usp=sharing
答案 0 :(得分:3)
调用doClick()
可能是一个尴尬的选择,因为它在内部使用Timer
。相反,请使用JToggleButton
,这样您就可以使用selected
根据setSelected()
状态控制每个按钮的外观。游戏Buttons
中显示了一个完整的示例。在Swing Timer
的ActionListener
中,选择当前按钮,play注释并增加sequence
索引。播放完所有音符后,取消选中所有按钮。
附录:您能说明如何实施计时器吗?
概括地说,给出了一个合适的切换按钮列表:
private static final int MAX = 4;
List<JToggleButton> buttons = new ArrayList<JToggleButton>(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.
}
}