1

現在の時刻を表示する Java GUI を作成しようとしています。現在、現在の時刻を表示させることができますが、起動時のみです。その後、それは単にその時間に永遠に残ります。その理由は、毎秒新しい現在の時刻に自動的にロードする方法がわからないためです。これまでの私の関連コードは次のとおりです。

// Getting the current time...
long epoch = System.currentTimeMillis() / 1000;
String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date(epoch * 1000));

// Creating the panel...
JLabel lblThetime = new JLabel(date);
sl_panel.putConstraint(SpringLayout.NORTH, lblThetime, 55, SpringLayout.SOUTH, lblIBeA);
sl_panel.putConstraint(SpringLayout.WEST, lblThetime, 139, SpringLayout.WEST, panel);
lblThetime.setFont(new Font("Avenir Next", Font.PLAIN, 40));

// Adding the time to the panel
panel.add(lblThetime);

// My refresher which doesn't work
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        removeAll();
        validate();
        repaint();
    }
}, 1000, 1000);

このスレッドの情報を使用して復習しようとしましたが、役に立たず、ウィンドウ (実行時) は空白です。次に、このスレッドの情報を使用して別のリフレッシャーを作成しようとしましたが、これを作成しました:

// My refresher which doesn't work
Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
        contentPane.remove(lblThetime);
        contentPane.add(lblThetime);
    }
}, 1000, 1000);

contentPane定義した上でprivate JPanel contentPane;

これも機能しませんでしたが、時間自体が空白で、ウィンドウ内の残りのコンテンツ (もう 1 つの JLabel (テキストのみ)) は通常どおりです。

リフレッシャーがないと、上記のように動作します。これにより、開始した時刻が表示され、その時刻が永久に残ります。

WindowBuilderでEclipseを使用しています。(そして、私は(おそらく明らかに)Java GUIの完全な初心者ですxD)

4

6 に答える 6

4

解決策を発見しました!

ここで回答として与えられたすべての解決策を試しましたが、コードを完全に機能させるものはありませんでしたが、すべての回答が正しい方向を示しました。名前を忘れたWebサイトで問題の解決策を見つけましたが、その提案を使用して、機能するこの最終的な解決策を思いつきました。

        // New timer which works!
    int delay = 1000; //milliseconds
      ActionListener taskPerformer = new ActionListener() {
          public void actionPerformed(ActionEvent evt) {
              String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date(System.currentTimeMillis()));
              lblThetime.setText(date);
          }
      };
      new Timer(delay, taskPerformer).start();

答えがなければ、おそらくこの解決策を見つけることができなかったので、答えてくれたすべての人に感謝します:D

于 2013-11-02T12:05:51.297 に答える
2

まず、javax.swing.Timerの代わりにjava.util.Timerを使用しています。Event Dispatch Threadで GUI の更新が確実に行われるようにするには、Swing コンポーネントを操作するときに、この 2 番目のクラスを使用する必要があります。Concurrency in Swingチュートリアルもご覧ください。

他の回答で示唆されているようにJLabel、テキストを更新するたびに削除/追加する必要はありません。JLabel.setText()メソッドを呼び出すだけです。

JLabelそれでも毎回削除/追加したい場合は、次のことに注意してください。

Container.add() javadocから:

このメソッドは、レイアウト関連の情報を変更するため、コンポーネント階層を無効にします。コンテナーが既に表示されている場合は、追加されたコンポーネントを表示するために、その後階層を検証する必要があります。

次に、 Component.revalidate()メソッドを呼び出す必要があります。このような:

contentPane.remove(lblThetime);
contentPane.add(lblThetime);
contentPane.revalidate();
于 2013-11-01T13:31:00.807 に答える
0

ラベルを削除してパネルに追加する代わりに、ラベルの文字列を毎秒変更する必要があります。

Timer timer = new Timer();
timer.scheduleAtFixedRate(new TimerTask() {
    @Override
    public void run() {
       String date = new java.text.SimpleDateFormat("HH:mm:ss").format(new java.util.Date() );

       lblThetime.setText(date);
    }
}, 1000, 1000);



// Creating the panel...
JLabel lblThetime = new JLabel(date);
于 2013-11-01T13:17:24.073 に答える
0

たとえば、次のように、そのタスクに Swing Timer を使用することができます。

private static JLabel l;

public static void main(String[] args) {

    Timer timer = new Timer(1000, new ActionListener() {

        @Override
        public void actionPerformed(ActionEvent arg0) {
            l.setText(new Date().toString());
        }
    });
    timer.start(); 
    JFrame f = new JFrame();
    l=new JLabel(new Date().toString());
    f.getContentPane().add(l);

    f.pack();
    f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    f.setVisible(true);
}

その例では、毎秒新しい日付で JLabel を更新します

于 2013-11-01T13:17:36.370 に答える
-2

手がかり 1: Java で Timer クラスを実際に検索します。正しいものを選びましたか?

手がかり 2: 代わりにラベル テキストを更新します。

ハイ

KL

于 2013-11-01T13:18:59.440 に答える