Можно ли сделать это более элегантно с помощью Swing Timer? - PullRequest
0 голосов
/ 21 марта 2010

Ниже приведен код для простейшего обратного отсчета в графическом интерфейсе. Можно ли сделать то же самое более коротким и элегантным способом с использованием таймера Swing?

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.SwingUtilities;

public class CountdownNew {

    static JLabel label;

    // Method which defines the appearance of the window.   
    public static void showGUI() {
        JFrame frame = new JFrame("Simple Countdown");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        label = new JLabel("Some Text");
        frame.add(label);
        frame.pack();
        frame.setVisible(true);
    }

    // Define a new thread in which the countdown is counting down.
    public static Thread counter = new Thread() {

        public void run() {
            for (int i=10; i>0; i=i-1) {
                updateGUI(i,label);
                try {Thread.sleep(1000);} catch(InterruptedException e) {};
            }
        }
    };

    // A method which updates GUI (sets a new value of JLabel).
    private static void updateGUI(final int i, final JLabel label) {
        SwingUtilities.invokeLater( 
            new Runnable() {
                public void run() {
                    label.setText("You have " + i + " seconds.");
                }
            }
        );
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                showGUI();
                counter.start();
            }
        });
    }

}

Ответы [ 3 ]

4 голосов
/ 21 марта 2010

Да, вы ДОЛЖНЫ использовать Swing Timer. Вы НЕ ДОЛЖНЫ использовать утилиты Timer и TimerTask.

Когда срабатывает таймер Swing, код выполняется в EDT, что означает, что вам просто нужно вызвать метод label.setText ().

При использовании uitl Timer и TimerTask код НЕ выполняется в EDT, а это означает, что вам нужно заключить код в SwingUtilities.invokeLater, чтобы убедиться, что код выполняется в EDT.

Таким образом, использование Swing Timer короче и элегантнее, чем ваш нынешний подход, оно упрощает кодирование, поскольку код выполняется в EDT.

0 голосов
/ 21 марта 2010

Да, используйте таймер.updateGUI был бы кодом для задачи таймера, но он потребует некоторых изменений, поскольку вы не сможете передавать i для каждого вызова, поскольку вы просто получаете метод run ().

0 голосов
/ 21 марта 2010

Вы можете сделать его немного элегантнее, используя Таймер с соответствующей TimerTask .

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