0

让我解释一下我想要做什么。

我有两个类扩展JFrameStartJFrameTestingJFrame。在 main 方法中,我启动了一个StartJFrame. 它有一个按钮,开始。按下该按钮后,我将其设置为隐藏该框架并启动TestingJFrame. 现在我在 T 中没有任何东西estingJFrame

在那个屏幕中,我希望在右下角有一个计时器标签,从 45 秒开始倒计时到 0。我还需要每 10 秒运行一次代码,并收集一些数据。将有两个按钮TestingJFrame,是和否。当其中一个被按下时,它应该停止计时器并保存信息。

数据基本上只是翻倍。每次运行程序时,我只会收集一次数据。我有一UserData堂课,其中包含有关测试主题的一些信息,以及一个双打列表,它每 10 秒添加一次。我对如何在 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();
                }
            });
        }
    }
}

查看Swing Timer了解更多信息

您问题的第二部分是含糊不清地可靠地为您提供答案。数据从何而来?怎么收的??

于 2013-02-04T00:10:52.703 回答