Thread.sleep和隐藏按钮

时间:2015-02-01 22:35:13

标签: java multithreading button

我在代码中遇到的问题是,当它运行button.setVisible(true);时,它不会将按钮设置为可见,直到所有其他if语句都通过,这真让我感到困惑

我试图让西蒙说,这try - catch做的是它使顺序中的按钮闪烁,以便用户可以知道它是哪个按钮接下来。

我是编程新手,所以欢迎任何提示和建议。 谢谢你看看!

try {

    inputOrder.clear();
    // System.out.println("THIS IS INPUT" + inputOrder);
    Sequence.add(randomNumber());
    int f = 0;
    for (; f < Sequence.size(); f++) {

        //Thread.sleep(2000);

        if (Sequence.get(f) == 1) {
            try {`
                btnNewButton.setVisible(false);
                Thread.sleep(1000); 
                } catch (InterruptedException e1) {

            }
            Thread.sleep(1000);
            System.out.println("it ran here");
            btnNewButton.setVisible(true);


        }
        if (Sequence.get(f) == 2) {
            try {
                btnBlue.setVisible(false);
                Thread.sleep(1000); 
                } catch (InterruptedException e1) {

            }Thread.sleep(1000);
            System.out.println("it ran here");
            btnBlue.setVisible(true);

        }
        if (Sequence.get(f) == 3) {
            try {
                btnYellow.setVisible(false);
                Thread.sleep(1000);
                } catch (InterruptedException e1) {

            }Thread.sleep(1000);
            System.out.println("it ran here");
            btnYellow.setVisible(true);


        }
        if (Sequence.get(f) == 4) {
            try {
                btnGreen.setVisible(false);
                Thread.sleep(1000); 
                } catch (InterruptedException e1) {

            }
            Thread.sleep(1000);
            System.out.println("it ran here");
            btnGreen.setVisible(true);

        }
        System.out.println(Sequence);
        // Order.add(getColor(Sequence.get(f)));
        System.out.println(Order);
        text.setText(String.valueOf(Order.size()));

    }

    btnNextRound.setVisible(false);
} catch (InterruptedException e1) {
    e1.printStackTrace();
}

2 个答案:

答案 0 :(得分:0)

看起来这种情况发生是因为你在UI线程中执行此操作,并且没有时间执行EventQueue,因为你强制睡眠UI线程,因为这个线程一旦完成就有机会实际完成绘制所有的睡眠电话。

为了获得所需的输出,我认为你应该将睡眠逻辑移动到一个单独的线程或SwingWorker。如果将逻辑移动到单独的线程,则需要使用EventQueue.InvokeLater启用按钮。

答案 1 :(得分:0)

Java Swing GUI的工作方式是一切都是一个接一个地发生。只有当您发布的整个方法完成后,才会显示下一个GUI事件(例如需要重新绘制事件以显示该按钮不再可见)。做一个Thread.sleep只会让你的方法需要更长的时间才能完成。结果是您的UI被冻结,因为在所有睡眠调用之后,其他事件(例如鼠标,键盘或重新绘制事件)都无法运行。

要在Java中执行动画,您应该使用javax.swing.Timer类而不是Thread.sleep。下面我发布了一个计时器的快速示例,启动时会导致按钮闪烁。这并不能完全解决您的问题(您还需要循环播放,但是您确实需要另一个计时器来实际安排按钮何时闪烁,以便它们不会立即发生)。

import javax.swing.Timer

/**
 * Timer that causes a button to flash (become invisible for 1 second, and then become visible again).
*/
public class ButtonFlashTimer extends Timer {

    private final JButton buttonToFlash;

    public ButtonFlashTimer(JButton button) {
        super(1000, new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent e) {
                // This method is called every 1000 ms (until we tell
                // it to stop). This allows us to perform the next "step"
                // in the animation.
                boolean isVisible = buttonToFlash.isVisible();
                if (isVisible) {
                    buttonToFlash.setVisible(false);
                } else {
                    buttonToFlash.setVisible(true);
                    // Once we've flashed, stop the timer (don't keep flashing).
                    stop();
                }
            }
        });
        buttonToFlash = button;
        // Become invisible immediately; the 1000 ms will be the time between the first
        // call to the actionPerformed (which will set it as invisible) and the second
        // call (which makes it visible again).
        setInitialDelay(0);
        setRepeats(true);
    }
}