0

スタート/ストップボタンが機能しない理由を誰か説明してもらえますか? これは完全に実装されたストップウォッチではありませんが、ここで立ち往生しました。どんな助けでも大歓迎です!フォーラムに質問を投稿するのはこれが初めてなので、投稿に問題がある場合は教えてください。これは私のコードです:

public class StopWatch {

    private static boolean tiktok;

    public static void setGo(boolean go) {
        tiktok = go;
    }

    public static void main(String[] args) {
        int counter = 0;
        StopWatch stop = new StopWatch();
        ClockFrame window = new ClockFrame("StopWatch");
        JLabel lb = window.init();
        while (true) {
            lb.setText(Integer.toString(counter++));
            if (counter == 61) {
                counter = 0;
            }
            try {
                Thread.sleep(1000);
            } catch (InterruptedException ex) {
            }
        }
    }

}

class ClockFrame extends JFrame {
    JLabel hour, minus, sec;

    public ClockFrame(String title) {
        super(title);
    }

    JLabel init() {
        JFrame frame = new JFrame("Stop Watch");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        JPanel time = new JPanel();
        hour = new JLabel("0");
        minus = new JLabel("0");
        sec = new JLabel("0");
        time.add(hour);
        time.add(minus);
        time.add(sec);

        JPanel pane = new JPanel();
        pane.setLayout(new FlowLayout());
        JButton start = new JButton("Start");
        start.addActionListener(new startstopActionListener(true));
        JButton stop = new JButton("Stop");
        stop.addActionListener(new startstopActionListener(false));
        JButton reset = new JButton("Reset");
        pane.add(start);
        pane.add(stop);
        pane.add(reset);

        Container window = frame.getContentPane();
        window.setLayout(new GridLayout(2, 1));
        window.add(pane);
        window.add(time);

        frame.setSize(500, 200);
        frame.setVisible(true);
        return sec;
    }
}

class startstopActionListener implements ActionListener {

    private boolean b;

    public startstopActionListener(boolean b) {
        this.b = b;
    }

    @Override
    public void actionPerformed(ActionEvent e) {
        StopWatch.setGo(b);
    }
}
4

2 に答える 2

3

Swing でストップウォッチを作成する場合は、javax.swing.Timerクラスを参照することをお勧めします。Swing コンポーネント (あなたの場合は a JLabel) を定期的に更新することが非常に簡単になります。を使用すると呼び出しがTimer回避Thread.sleepされますが、これは UI をブロックするため、イベント ディスパッチ スレッドで呼び出すべきではありません。

JB Nizet は、すでにSwing 並行性チュートリアルへのリンクを提供しています。このサイトの「Swing 情報ページ」のSwing 同時実行セクションにあるリンクと、関連する質問に対する私の回答も参照することをお勧めします。

于 2012-07-15T20:27:16.960 に答える
3

Swing のスレッド化ポリシーを尊重していません。

  1. Swing コンポーネントは、イベント ディスパッチ スレッドからのみ使用する必要があります
  2. 実行時間の長いブロッキング メソッド (無限ループでラベルを更新するメソッドなど) は、イベント ディスパッチ スレッドから実行する必要があります (ただし、ラベルの更新は EDT で行う必要があります - ルール 1 を参照してください)。

並行性に関する Swing チュートリアルを読んでください。

于 2012-07-15T19:38:01.937 に答える