首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >Wait()、Notify()、timers和Jbutton

Wait()、Notify()、timers和Jbutton
EN

Stack Overflow用户
提问于 2013-06-12 14:09:11
回答 2查看 1.2K关注 0票数 0

我甚至不确定如何处理这个问题,但在阅读了一些内容并尝试了很多次(失败)之后,我决定向社区寻求帮助。我有一个表单A,它打开并要求用户输入一个时间来延迟表单B的打开。目前我正在使用sleep()来做这件事,但现在我想插入另一个对话框,允许用户中断计时器,并在计时器用完之前调出表单B。我相信正确的方法是使用wait()notify(),但我似乎不能理解生产者和消费者模型的大量例子。任何帮助都是非常感谢的。

EN

回答 2

Stack Overflow用户

发布于 2013-06-12 21:28:49

这对javax.swing.Timer来说是一份完美的工作。详情请参考How to Use Swing Timers。这里有一个例子来引导你朝着正确的方向前进。

代码语言:javascript
复制
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);
            }
        });
    }
}
票数 1
EN

Stack Overflow用户

发布于 2013-06-12 14:16:11

最简单的方法就是这样做

代码语言:javascript
复制
Thread a = new Thread(new Runnable(){
   public void run(){
      //do whatever display
      try{
        Thread.sleep(timeToShowBform);
      }
      catch(InterruptedException ex){
         //interrupted.
      }finally{
      //show form B
      SwingUtilities.invokeLater(...)

   }
});

class BRunnable implements Runnable{
public void run(){
 //if clicked, then this runnable is called.
 a.interrupt();
}
}

假设线程asleep被阻塞,然后在调用a.interrupt()时唤醒a

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/17058703

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档