gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-12-01 14:27:49 25 4
gpt4 key购买 nike

我不知道如何解决这个问题,但在做了一些阅读和多次尝试(失败)之后,我决定向社区寻求帮助。我有表格 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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com