我的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语句可以工作。
答案 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();