Set.visible实际上并没有为我做任何事情,或者thread.sleep正在使我烦恼

时间:2019-05-30 19:38:50

标签: java

我的pulseRed(为红色jButton产生脉冲)方法应使按钮可见,等待一秒钟,然后再次使其不可见。顺便说一下,我已将按钮启动为不可见。但是,当我运行它时,该按钮从未设置为可见。我有一些打印语句,说应该将它们设置为可见,但事实并非如此。我不知道计时器或set.visible部分是否有问题。

我尝试了不同的计时器,但是它们都有点复杂,我对Java还是有点陌生​​。我确实尝试过,而不是使按钮可见然后不可见,而是使按钮越来越大以模拟脉冲。但这也不起作用,这让我觉得这是计时器问题。

此处提供代码:

import java.awt.Color;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.*;

public class redButtonPulseQuestionCode {
    private static JButton redButton = redButton();
    private static JButton startButton = new JButton("Start");

    redButtonPulseQuestionCode() {
        JFrame colorFrame = new JFrame("Simon Says Game");
        JPanel colorPanel = new JPanel();

        colorPanel.setBounds(0, 0, 500, 500);
        colorPanel.setBackground(Color.DARK_GRAY);
        colorFrame.setLayout(null);
        colorPanel.setLayout(null);

        startButton.setBackground(Color.white);

        colorPanel.add(redButton);
        colorPanel.add(startButton);

        redButton.setBounds(50, 175, 100, 100);
        redButton.setVisible(false);

        startButton.setBounds(335, 400, 100, 50);

        colorFrame.add(colorPanel);
        colorFrame.setSize(500,500);
        colorFrame.setLocationRelativeTo(null); //sets the game to the center of the screen    
        colorFrame.setLayout(null);
        colorFrame.setVisible(true);
        colorFrame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    }

    public static void main(String [] args) {
        new redButtonPulseQuestionCode();
        startButton.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                    // does stuff when the start button is pressed
                        //setEveryButtonInvisible();
                        startGame();
                }
            });
    }

    public static JButton redButton() {
        JButton redButton = new JButton();
        redButton.setBackground(Color.red);
        return redButton;
    }

    public static void timer1() 
    {
        try 
        {
            Thread.sleep(1000);
        } catch(InterruptedException ie) 
        {

        }
    }

    public static void pulseRed() {
        redButton.setVisible(true);
        System.out.println("set red visible");
        timer1();
        redButton.setVisible(false);
        System.out.println("set red invisible");
    }

    public static void startGame() {
        boolean userAnswer = true;
        int round = 0;
        System.out.println("Start game");
        pulseRed();

}
}

理论上,当您按下开始按钮时,应使红色按钮可见,然后在1秒钟的延迟后将其关闭。但是,在此代码的情况下,它不会出现,但是print语句可以工作。

1 个答案:

答案 0 :(得分:1)

您不应该仅在这样的GUI应用程序的UI线程上调用Thread.sleep

发生的事情是,您将按钮设置为可见,但是在屏幕有机会更新按钮的可见性之前,您告诉线程处于睡眠状态。这将阻止屏幕更新按钮。屏幕“唤醒”后,将按钮设置为再次不可见。这就是为什么您永远看不到按钮出现的原因。

应该要做的是使用Timer。您可以像这样使用java.swing.Timer

redButton.setVisible(true);
Timer t = new Timer(1000, e -> {
    redButton.setVisible(false);
});
t.setRepeats(false);
t.start();