【发布时间】:2017-04-06 16:01:55
【问题描述】:
我想在按钮单击操作完成之前完成一些代码后一个接一个地更新 4 个 JTextField。目前使用 start() 和 join() 如下所示,但它只是在 actionPerformed 结束时更新。有什么想法吗?
public void jBsendActionPerformed(ActionEvent e) {
try{
selectedPort=jCports.getSelectedItem().toString();
//Thread t1;
Thread t1 = new Thread(new Runnable() {
@Override
public synchronized void run() {
try {
String data = "*"+jTx.getText()+jTy.getText()+jTx1.getText()+jTy1.getText()+jTl1.getText()+jTb1.getText()+"#";
obj.writeData(selectedPort, data);
String RFID1=obj.readData(selectedPort);
jTrfid1.setText(RFID1); // Want to update this textfield before executing the rest of the code, same for the next three textfields
System.out.println(RFID1);
} catch (SerialPortException ex) {
Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
t1.start();
t1.join();
Thread t2 = new Thread(new Runnable() {
@Override
public synchronized void run() {
try {
String data = "*"+jTx2.getText()+jTy2.getText()+jTl2.getText()+jTb2.getText()+"#";
obj.writeData(selectedPort, data);
String RFID2=obj.readData(selectedPort);
} catch (SerialPortException ex) {
Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
t2.start();
t2.join();
Thread t3 = new Thread(new Runnable() {
@Override
public synchronized void run() {
try {
String data = "*"+jTx3.getText()+jTy3.getText()+jTl3.getText()+jTb3.getText()+"#";
obj.writeData(selectedPort, data);
String RFID3=obj.readData(selectedPort);
jTrfid3.setText(RFID3);
System.out.println(RFID3);
} catch (SerialPortException ex) {
Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
t3.start();
t3.join();
Thread t4 = new Thread(new Runnable() {
@Override
public synchronized void run() {
try {
String data = "*"+jTx4.getText()+jTy4.getText()+jTl4.getText()+jTb4.getText()+"#";
obj.writeData(selectedPort, data);
String RFID4=obj.readData(selectedPort);
jTrfid4.setText(RFID4);
System.out.println(RFID4);
} catch (SerialPortException ex) {
}
}
});
t4.start();
t4.join();
}
我也尝试过 swingworker 和 swingutilites。但仍然无法正常工作..请帮助..
【问题讨论】:
-
您不想创建多个线程。您无法控制它们的执行顺序。您只需要一个线程一次处理一个请求,然后发布每个请求的结果。我认为 SwingWorker 没有理由不工作。只需确保在收到值后“发布”该值。阅读 Concurrency 上的 Swing 教程部分了解更多信息。
标签: java multithreading swing user-interface concurrency