Таймер блокировки потока в Swing - PullRequest
0 голосов
/ 09 декабря 2018

Я пытаюсь создать приложение таймера на Java, но в процессе подсчета оно не выполнит основное (также открывая окно), пока счетчик не завершит работу.Вот что я имею в виду:

long timeElapsed = 0;
    long timeStart = System.currentTimeMillis();
    for (long counter=0;counter<5;++counter) {
        TimeUnit.SECONDS.sleep(1);
        timeElapsed = (System.currentTimeMillis() - timeStart)/1000;
        display.setText(Long.toString(timeElapsed));
    }
    String myString = Long.toString(timeElapsed);

Программа не создаст окно, пока не закончится оператор for, что плохо, потому что не отображает время до его выполнения, а это не то, к чему я стремлюсь,Есть ли способ обновить окно во время его работы, чтобы программа отображала истекшее время?

Мой код:

import java.awt.EventQueue;
import javax.swing.JFrame;
import java.awt.FlowLayout;
import java.awt.GridLayout;
import java.util.concurrent.TimeUnit;
import javax.swing.BoxLayout;
import javax.swing.JLabel;
import javax.swing.JButton;

public class TimerGUI {

    private JFrame frame;

    /**
     * Launch the application.
     */
    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    TimerGUI window = new TimerGUI();
                    window.frame.setVisible(true);
                } catch (Exception e) {
                    e.printStackTrace();
                }
            }
        });
    }

    /**
     * Create the application.
     * @throws InterruptedException 
     */
    public TimerGUI() throws InterruptedException {
        initialize();
    }

    /**
     * Initialize the contents of the frame.
     * @throws InterruptedException 
     */
    private void initialize() throws InterruptedException {
        JLabel display = new JLabel("a");
        // TIME
        long timeElapsed = 0;
        long timeStart = System.currentTimeMillis();
        for (long counter=0;counter<5;++counter) {
            TimeUnit.SECONDS.sleep(1);
            timeElapsed = (System.currentTimeMillis() - timeStart)/1000;
            display.setText(Long.toString(timeElapsed));
        }
        String myString = Long.toString(timeElapsed);


        //WINDOW
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);

        // LABEL
        //display = new JLabel(myString);
        display.setBounds(165, 64, 89, 54);
        frame.getContentPane().add(display);


        //BUTTON
        JButton btnNewButton = new JButton("New button");
        btnNewButton.setBounds(165, 169, 89, 32);
        frame.getContentPane().add(btnNewButton);



    }
}

Примечание: я еще не использую часть программы с кнопками итакже код, который я пытаюсь исправить, находится в методе Initialize().

Ответы [ 2 ]

0 голосов
/ 09 декабря 2018

Вы можете ссылаться на следующую ссылку ниже:

В этом методе вы можете обновить свой компонент пользовательского интерфейса (например, JLabel), указав истекшее время

Java Swing Timer

0 голосов
/ 09 декабря 2018

Добро пожаловать в удивительный мир «Дорогая, я заблокировал поток рассылки событий»

Swing является как однопоточным, так и небезопасным.Это означает, что если вы заблокируете поток диспетчеризации событий, выполнив что-то вроде Thread.sleep, пользовательский интерфейс не сможет обновиться, поскольку вы заблокировали поток, ответственный за его обновление.

Точно так же вы должныне обновлять пользовательский интерфейс или что-либо еще, на что полагается пользовательский интерфейс, вне контекста EDT, что оставляет в вас загадку.

К счастью для нас, разработчики Swing предвидели эту проблему при наличии ряда возможныхРешения, в вашем случае, лучшее, вероятно, старый добрый Swing Timer

Начните с изучения Параллельность в Swing и Как использовать Swing Timer s для получения более подробной информации.

Я также должен добавить, Timer s (и Thread.sleep) по своей сути неточно, гарантируя только "по крайней мере" точность.Вместо того чтобы использовать счетчик для отслеживания того, как долго они работают, вы должны использовать вместо этого java.time API, , например

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...