Java 从JOptionPane到线程的异步通信
我试图弄清楚如何将变量从Java 从JOptionPane到线程的异步通信,java,multithreading,swing,asynchronous,joptionpane,Java,Multithreading,Swing,Asynchronous,Joptionpane,我试图弄清楚如何将变量从JOptionPane设置为正在运行的主线程。根据JOptionPane对话框的结果,这将影响该主线程中的某些逻辑。下面是一个粗略的例子: public class MainThread { public static void main(String[] args) { Timer timer = new Timer(); timer.scheduleAtFixedRate(new M
JOptionPane
设置为正在运行的主线程。根据JOptionPane
对话框的结果,这将影响该主线程中的某些逻辑。下面是一个粗略的例子:
public class MainThread {
public static void main(String[] args) {
Timer timer = new Timer();
timer.scheduleAtFixedRate(new MyTask(), 0, 1000);
}
}
public class MyTask extends TimerTask {
int x = 0;
AsyncPopUp popUp = new AsyncPopUp();
public void run() {
// code to detect reset here
// x = 0;
x++;
System.out.println(x);
if (x==10){
new AsyncPopUp().showMessage();
}
}
}
public class AsyncPopUp {
void showMessage() {
Thread t = new Thread(new Runnable() {
@Override
public void run() {
int response = JOptionPane.showConfirmDialog(null, "Reset Counter?",
"Question", JOptionPane.YES_NO_OPTION);
if (response == 0){
System.out.println("Send Message to task to reset");
}
}
});
t.start();
}
}
我可能走错了方向。也许我应该将JPanel
与ActionListener
一起使用?还是一个SwingWorker
谢谢
我认为这可能有效——如果这是一种不好的做法,请告诉我:
public class Async {
private Boolean response = false;
private Thread t;
public void start() {
new Timer().schedule(new TimerTask() {
int x = 0;
@Override
public void run() {
System.out.println(x);
if (x == 10) {
t = new Thread(new DoTask());
t.start();
}
if (response == true) {
System.out.println("true");
x = 0;
response = false;
} else {
System.out.println("false");
}
x++;
}
}, 0, 1000);
}
public class DoTask implements Runnable {
@Override
public void run() {
int optionResponse = JOptionPane.showConfirmDialog(null,
"Reset Counter?","Question", JOptionPane.YES_NO_OPTION);
if (optionResponse == 0) {
response = true;
}
}
}
}
您的第一个“粗略示例”离有效解决方案不远(如果我正确理解了问题):
- 在
类中添加一个MyTask
方法,如果用户决定重置,该方法将执行任何应该发生的操作reset()
- 将构造函数添加到
类中,该类需要AsyncPopUp
对象作为参数,并将其保存到字段MyTask
task
- 在
类中执行MyTask
时,将newasyncPopup
作为构造函数参数传递此
- 执行
调用System.out.println(“将消息发送到要重置的任务”)
task.reset()
顺便说一句:请注意,
if(response==JOptionPane.YES\u选项)
看起来比if(response==0)
.-) 你到底想达到什么目的?您发布的代码将(假设AsyncPopup按暗示方式工作)在10秒后显示一个弹出窗口,然后每秒钟显示一次。你问题中的措辞意味着做相反的事情(显示一个弹出窗口,然后更新主线程对象上的状态)。我试图在不停止主循环的情况下从用户那里获取输入。对话框的响应将影响主循环。在本例中,10秒后会出现一个弹出对话框,而不会暂停主循环(x==10)。它仅在x==10时出现。我需要对话框的响应来确定是否需要重置计数器。但是,我需要计数器在等待响应时继续。我将检查SecondaryLoop的链接,这可能会解决我的问题。SecondaryLoop似乎不允许异步?