0
我试图找出如何从一个JOptionPane
变量设置为正在运行的主线程。基于该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;
}
}
}
}
什么是你真正想达到什么目的?您发布的代码(假设AsyncPopup作品所暗示的)10秒后显示弹出,那么每一秒开始。你的问题中的措辞意味着做相反的事情(显示弹出窗口然后更新主线程对象的状态)。 – SimonC 2012-03-06 06:49:59
检查了这一点http://docs.oracle.com/javase/7/docs/api/java/awt/SecondaryLoop.html – MahdeTo 2012-03-06 12:28:44
有一个主循环是一个简单的计数器。我正在尝试从用户处获得输入而不停止主循环。对话框的响应会影响主循环。在这个例子中,10秒后出现一个弹出对话框而不暂停主循环(x == 10)。它仅在x == 10时出现。我需要对话框的响应来确定是否需要重置计数器。不过,我需要计数器在等待响应时继续。我将查看可能解决我的问题的SecondaryLoop链接。 – 2012-03-06 13:31:08