java - Wait()、Notify()、计时器和 Jbuttons

标签 java multithreading swing sleep wait

我不知道如何解决这个问题,但在做了一些阅读和多次尝试(失败)之后,我决定向社区寻求帮助。我有表格 A,它打开并要求用户输入延迟表格 B 打开的时间。目前我正在使用 sleep() 来执行此操作,但现在我想插入另一个对话框,以允许用户中断计时器并在计时器用完之前调出表单 B。我相信正确的方法是使用 wait()notify() 但我似乎无法理解生产者和消费者模型的众多示例。如有任何帮助,我们将不胜感激。

最佳答案

对于javax.swing.Timer来说是一个完美的工作。引用How to Use Swing Timers了解详情。这是一个指导您正确方向的示例。

import java.awt.*;
import java.awt.event.*;
import javax.swing.Timer;
import javax.swing.*;

public class TimerDemo extends JFrame implements ActionListener {

    private Timer timer;
    private JButton jbDoSomethingDelayed;
    private JButton jbDoItImmediately;

    public TimerDemo() {        
        setLayout(new FlowLayout());
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setTitle("Timer demo");

        jbDoSomethingDelayed = new JButton("Do something with a delay");
        jbDoItImmediately = new JButton("Do it. Do it NOW!");

        add(jbDoSomethingDelayed);
        add(jbDoItImmediately);

        jbDoItImmediately.setEnabled(false);

        timer = new Timer(0, this); // we override delay later
        timer.setRepeats(false); // we don't want it firing repeatedly

        jbDoSomethingDelayed.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                String msg = "Enter delay and confirm dialog";
                JSpinner spinner = new JSpinner(new SpinnerNumberModel(5, 1, 10, 1));
                Object[] content = new Object[] {msg, spinner};
                int showConfirmDialog = JOptionPane.showConfirmDialog(TimerDemo.this, content, "Choose", JOptionPane.OK_CANCEL_OPTION);
                if (showConfirmDialog == JOptionPane.OK_OPTION) {
                    // the important part
                    timer.setInitialDelay(((Integer)spinner.getValue()) * 1000);                    
                    jbDoSomethingDelayed.setEnabled(false);
                    jbDoItImmediately.setEnabled(true);
                    timer.start();
                }
            }
        });

        jbDoItImmediately.addActionListener(new ActionListener() {
            public void actionPerformed(ActionEvent e) {
                timer.stop();
                onTimerTimeout();
            }
        });

        pack();
        setLocationRelativeTo(null);
    }

    public void actionPerformed(ActionEvent e) {
        // called by timer on EDT, no worries here
        onTimerTimeout();
    }

    private void onTimerTimeout() {   
        jbDoSomethingDelayed.setEnabled(true);
        jbDoItImmediately.setEnabled(false);
        JOptionPane.showConfirmDialog(this, "You've done it now. No, really...", "It is done", JOptionPane.DEFAULT_OPTION, JOptionPane.INFORMATION_MESSAGE);        
    }

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                TimerDemo demo = new TimerDemo();
                demo.setVisible(true);
            }
        });
    }
}

关于java - Wait()、Notify()、计时器和 Jbuttons,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17058703/

相关文章:

JAVA:数字的存储?

c# - 使用计时器/任务/后台 worker 的数据采集循环

java - 在 Java swing 应用程序中打印标签

java - 基本动画未执行

java - 如何用Java中的Canvas根据屏幕的宽度和高度绘制字符串或矩形

java - 无法使用@UpdateTimestamp注释更新时间戳

java - 如何在我的 javadoc 示例中编写 block 注释?

java - Postgres 中的 NamedParameterJdbcTemplate 和 JSON

c# - 使用 TPL 的 Parallel.ForEach 时跟踪进度

c++ - 在 C++ 11 线程中通过引用传递;变化是本地化的