0

私はJLabelを持っています。最初に、テキストを設定しました。

JLabel j = new JLabel();
// set width height and position

j.setText("Hello");

Hello というテキストを 5 秒間表示するだけです。次に、テキスト Bye を表示します。

どうすればこれを行うことができますか。

私の仕組み; しかし、一度に1つのif-elseブロックしか実行しないため、間違っていることはわかっています。タイマーかカウンターが必要だと思います。これを機能させるには。ヘルプ ?

long time = System.currentTimeMillis();

if ( time < (time+5000)) { // adding 5 sec to the time
    j.setText("Hello");

} else {
    j.setText("Bye");

}
4

1 に答える 1

5

Swingはイベント駆動型の環境であり、理解する必要のある最も重要な概念の1つは、イベントディスパッチスレッドを決してブロックしてはならないということです(ループ、I / O、またはを含むがこれらに限定されませんThread#sleep) 。

そうは言っても、あなたの目標を達成する方法があります。最も簡単なのはjavax.swing.Timerクラスを通してです。

public class TestBlinkingText {

    public static void main(String[] args) {

        EventQueue.invokeLater(new Runnable() {

            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (ClassNotFoundException ex) {
                } catch (InstantiationException ex) {
                } catch (IllegalAccessException ex) {
                } catch (UnsupportedLookAndFeelException ex) {
                }

                JFrame frame = new JFrame();
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.setLayout(new BorderLayout());
                frame.add(new BlinkPane());
                frame.setSize(200, 200);
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);
            }

        });

    }

    protected static class BlinkPane extends JLabel {

        private JLabel label;
        private boolean state;

        public BlinkPane() {
            label = new JLabel("Hello");
            setLayout(new GridBagLayout());

            add(label);
            Timer timer = new Timer(5000, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent ae) {
                    label.setText("Good-Bye");
                    repaint();
                }
            });
            timer.setRepeats(false);
            timer.setCoalesce(true);
            timer.start();
        }
    }
}

チェックアウト

詳細については

于 2012-12-03T20:47:17.673 に答える