2

私は、 Swing Timer クラスまたはSwingUtilities.InvokeLaterを提案する主題に関するさまざまなスレッドを読んでいました。

...しかし、私は頭を包むのに苦労しています。

カウントダウンタイマーを作成するためにatomicIntegerを使用しましたが、コンソールで正常に動作します。ただし、Swingに組み込んでみると、開始値と終了値のみが更新されます(たとえば、5秒のカウントダウンがフレームに表示されるように設定します:「5」-> 5秒後->「0」。

atomicInteger カウントダウン ラベルを保持して「更新」する簡単な方法はありますか、または Swing Timer クラスを使用する唯一の方法はありますか?

お待ちいただいてありがとうございます!

ps。宿題ではなく、勉強するためのカスタム タイマーを自分で作ろうとしているだけです。(つまり、先延ばし)

このクラスで十分だと思います。フレーム/パネル コードも必要な場合はお知らせください。

private class ClickListener implements ActionListener{

     public void actionPerformed(ActionEvent e){            
         int t_study = 5;
         atomicDown.set(t_study);

         if (e.getSource() == b_study){
             while(atomicDown.get() > 0){       
                t_study = atomicDown.decrementAndGet(); 
        l_studyTime.setText(Integer.toString(t_study));
             try {
                Thread.sleep(1000);
             }
             catch (InterruptedException e1) {
                 System.out.println("ERROR: Thread.sleep()");   
                 e1.printStackTrace();
             }
          }
     }
     else if(e.getSource() == b_exit){
         System.exit(0); 
     }
     else
         System.out.println("ERROR: button troll");
     }
}
4

1 に答える 1

3

コード スニペットを SSCCE に変換した後、これが得られます (元のコードを理解している限り、うまくいくようです)。

変数名は変更していません。クラス、メソッド、および属性名の一般的なJava 命名規則1を学び、それを一貫して使用してください。

  1. 具体的には、のような名前は、または類似b_studyの線に沿ったものにする必要があります。studyButton「ボタン」は名前の一部であってはならないことに注意する人もいますが、「スタディ」ボタンとラベルの両方を備えた GUI がある場合、それらを分離する他の論理的な方法は見当たりません。

import java.awt.event.*;
import javax.swing.*;
import java.util.concurrent.atomic.AtomicInteger;

class TimerTicker {

    public static final int STUDY_TIME = 15;
    AtomicInteger atomicDown = new AtomicInteger(STUDY_TIME);
    JButton b_study;
    JButton b_exit;
    JLabel l_studyTime;

    TimerTicker() {
        JPanel gui = new JPanel();

        b_study = new JButton("Study");
        ClickListener listener = new ClickListener();
        b_study.addActionListener(listener);
        gui.add(b_study);

        b_exit = new JButton("Exit");
        b_exit.addActionListener(listener);
        gui.add(b_exit);

        l_studyTime = new JLabel("" + atomicDown.get());
        gui.add(l_studyTime);

        JOptionPane.showMessageDialog(null, gui);
    }

    private class ClickListener implements ActionListener {

        Timer timer;

        public void actionPerformed(ActionEvent e){
            if (e.getSource() == b_study) {
                ActionListener countDown = new ActionListener() {

                    public void actionPerformed(ActionEvent ae) {
                        if (!(atomicDown.get() > 0)) {
                            timer.stop();
                            // reset the count.
                            atomicDown.set(STUDY_TIME);
                        } else {
                            l_studyTime.setText(
                                Integer.toString(
                                    atomicDown.decrementAndGet()));
                        }
                    }
                };
                timer = new Timer(1000,countDown);
                timer.start();
            } else if(e.getSource() == b_exit) {
                System.exit(0);
            } else {
                System.out.println("ERROR: button troll");
            }
        }
    }

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                new TimerTicker();
            }
        });
    }
}
于 2012-04-05T03:26:35.707 に答える