Мой метод 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 секунду. Но в случае с этим кодом он не появляется, но операторы печати работают.
Вы не должны просто вызывать Thread.sleep
в потоке пользовательского интерфейса приложения с графическим интерфейсом.
Происходит следующее: вы настраиваете кнопку так, чтобы она была видимой, но прежде чем экран успеет обновить видимость кнопки, вы сообщаете потоку сон. Это останавливает экран от обновления кнопки. После того, как экран «просыпается», вы снова делаете кнопку невидимой. Вот почему вы никогда не видите, как появляется кнопка.
Что вы делаете, должен, так это используете Timer
. Вы можете использовать java.swing.Timer
, например:
redButton.setVisible(true);
Timer t = new Timer(1000, e -> {
redButton.setVisible(false);
});
t.setRepeats(false);
t.start();
Большое спасибо, я видел подобные вещи в других местах, но они казались слишком сложными для простого односекундного таймера.
Приложения @RyanS с графическим интерфейсом являются по своей сути более сложны, чем приложения командной строки (если бы это было приложение командной строки, Thread.sleep
работало бы), что является одной из причин, по которой новички начинают с написания приложений командной строки.
Сделайте это redButton.setVisible(true);