0

私がやろうとしていることを説明しましょう。

と を拡張する 2 つのクラスJFrameStartJFrameありTestingJFrameます。main メソッドでは、StartJFrame. それは単一のボタン、スタートを持っています。それを押すと、そのフレームを非表示にして を起動するように設定していTestingJFrameます。現在、 T には何もありませんestingJFrame

その画面では、右下隅に、45 秒から始まり 0 までカウントダウンするタイマーのラベルを表示したいと考えています。また、10 秒ごとにコードを実行し、データを収集する必要があります。TestingJFrameには、[はい] と [いいえ]の 2 つのボタンがあります。いずれかを押すと、タイマーが停止し、情報が保存されます。

データは基本的に倍精度です。プログラムの実行ごとに 1 回だけデータを収集します。UserData被験者に関する情報を保持するクラスと、10 秒ごとに追加される double のリストがあります。Javaでデータを保存する方法についての一般的な考えがあります。

私の質問は、45 秒からカウントダウンするようにタイマーを設定する方法です。タイマーが 0 に達するか、ユーザーが [はい] または [いいえ] ボタンを押すと、データを保存する関数が呼び出されますか? セーブデータ部分はなんとかなると思います。

これが本当に簡単な場合は申し訳ありませんが、私はJava(c#から)が初めてで、Swingは私を少し混乱させてきました。

4

2 に答える 2

3

javax.swing.Timerを使用してタイマーを設定できます。公式チュートリアルもご覧いただけます。

于 2013-02-04T00:02:39.310 に答える
3

最初の部分 (カウントダウンの表示とタイマーの停止) は比較的簡単です...

public class TimerTest01 {

    public static void main(String[] args) {
        new TimerTest01();
    }

    public TimerTest01() {
        EventQueue.invokeLater(new Runnable() {
            @Override
            public void run() {
                try {
                    UIManager.setLookAndFeel(UIManager.getSystemLookAndFeelClassName());
                } catch (Exception ex) {
                }

                JFrame frame = new JFrame("Test");
                frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
                frame.add(new TestPane());
                frame.pack();
                frame.setLocationRelativeTo(null);
                frame.setVisible(true);

            }
        });
    }

    public class TestPane extends JPanel {

        private JLabel label;
        private Timer timer;
        private long startTime;

        public TestPane() {
            setLayout(new GridLayout(0, 1));
            label = new JLabel("...");
            label.setHorizontalAlignment(JLabel.CENTER);
            final JButton btn = new JButton("Start");
            btn.addActionListener(new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    if (timer.isRunning()) {
                        timer.stop();
                        btn.setText("Start");
                    } else {
                        startTime = System.currentTimeMillis();
                        timer.restart();
                        btn.setText("Stop");
                    }
                    repaint();
                }
            });
            add(label);
            add(btn);

            timer = new Timer(250, new ActionListener() {
                @Override
                public void actionPerformed(ActionEvent e) {
                    long endTime = (startTime + 45000);
                    long timeLeft = endTime - System.currentTimeMillis();
                    if (timeLeft < 0) {
                        timer.stop();
                        label.setText("Expired");
                        btn.setText("Start");
                    } else {
                        label.setText(Long.toString(timeLeft / 1000));
                    }
                    repaint();
                }
            });
        }
    }
}

詳細については、スイングタイマーをご覧ください

質問の 2 番目の部分は、確実に答えを提供するために曖昧にすることです。データはどこから来ていますか?どのように収集されますか??

于 2013-02-04T00:10:52.703 に答える