Set.visible на самом деле ничего не делает для меня, или thread.sleep меня обманывает

Мой метод 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 секунду. Но в случае с этим кодом он не появляется, но операторы печати работают.

Сделайте это redButton.setVisible(true);

Sambit 30.05.2019 21:45
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
2
1
27
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Вы не должны просто вызывать Thread.sleep в потоке пользовательского интерфейса приложения с графическим интерфейсом.

Происходит следующее: вы настраиваете кнопку так, чтобы она была видимой, но прежде чем экран успеет обновить видимость кнопки, вы сообщаете потоку сон. Это останавливает экран от обновления кнопки. После того, как экран «просыпается», вы снова делаете кнопку невидимой. Вот почему вы никогда не видите, как появляется кнопка.

Что вы делаете, должен, так это используете Timer. Вы можете использовать java.swing.Timer, например:

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

Большое спасибо, я видел подобные вещи в других местах, но они казались слишком сложными для простого односекундного таймера.

Ryan S 30.05.2019 23:23

Приложения @RyanS с графическим интерфейсом являются по своей сути более сложны, чем приложения командной строки (если бы это было приложение командной строки, Thread.sleep работало бы), что является одной из причин, по которой новички начинают с написания приложений командной строки.

Sweeper 30.05.2019 23:53

Другие вопросы по теме