Java doClick()和Simon:所有按钮将同时取消按下,而不是单独取消按下

Java doClick()和Simon:所有按钮将同时取消按下,而不是单独取消按下,java,swing,jbutton,actionlistener,Java,Swing,Jbutton,Actionlistener,嗨,我是新来的,所以如果我犯了错误,请容忍我 我正在为一个班级项目制作这个Java Simon Says游戏。它通过随机数生成器为每个序列#工作。我通过doClick()显示序列,但事先删除actionlisteners,然后添加它 问题是,在按下所有其他按钮之前,这些按钮不会解除待命或待命。我已经尝试使用thread.sleep在每个if…else语句之间设置一个延迟,但它只会被按住更长的时间。我已经尝试在try中通过repaint()、revalidate()和updateUI()更新gui

嗨,我是新来的,所以如果我犯了错误,请容忍我

我正在为一个班级项目制作这个Java Simon Says游戏。它通过随机数生成器为每个序列#工作。我通过doClick()显示序列,但事先删除actionlisteners,然后添加它

问题是,在按下所有其他按钮之前,这些按钮不会解除待命或待命。我已经尝试使用thread.sleep在每个if…else语句之间设置一个延迟,但它只会被按住更长的时间。我已经尝试在try中通过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文件中有完整的代码,以前的尝试都被注释掉了,如果这样有帮助的话。

调用
doClick()
可能是一个尴尬的选择,因为它在内部使用了。相反,请使用,这将允许您使用
setSelected()
根据每个按钮的
selected
状态控制每个按钮的外观。游戏中显示了一个完整的示例。在Swing的
ActionListener
中,选择当前按钮及其注释,并增加
序列
索引。播放完所有音符后,取消选择所有按钮


附录:你能展示一下你是如何实现定时器的吗

在大纲中,给出了适当的切换按钮列表:

private static final int MAX = 4;
List<JToggleButton> buttons = new ArrayList<JToggleButton>(MAX);
private int i;
切换按钮的项目侦听器应根据其状态更新按钮的外观:

@Override
public void itemStateChanged(ItemEvent e) {
    JToggleButton b = (JToggleButton) e.getItem();
    if (b.isSelected()) {
        // change icon, color etc.
    } else {
        // restore icon, color etc.
    }
}

你能展示一下你是如何实现计时器的吗?我有JToggleButtons,现在我知道了。我只需要让它不被选中,可悲的是,我画了一个空白。还感谢您提供播放声音的链接。我一直在尝试,你的帮助总体来说是非常好的。谢谢再次感谢您的回复!我已经实现了代码,我很好。对不起,我花了这么长时间才回复,刚刚回到课堂,所以事情变得很疯狂。再次感谢,请继续帮助像我这样的新手。我们对此表示感谢
@Override
public void itemStateChanged(ItemEvent e) {
    JToggleButton b = (JToggleButton) e.getItem();
    if (b.isSelected()) {
        // change icon, color etc.
    } else {
        // restore icon, color etc.
    }
}