我想要更新4个JTextFields一个接一个完成一些代码之前,按钮点击动作完成。当前正在使用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。但还是不能工作..请帮帮我..
发布于 2017-04-07 00:10:55
您应该在UI线程上更新swing组件的状态(事件调度)。在你的例子中,是在jBsendActionPerformed方法中,而不是在其他线程上。或者,当您想要从其他线程更新时,调用SwingUtilities.invokeLater方法并在此方法中更新gui的状态。
我认为更好的解决方案是使用swing worker。
public void jBsendActionPerformed(ActionEvent e) {
selectedPort=jCports.getSelectedItem().toString();
final String data = "*"+jTx.getText()+jTy.getText()+jTx1.getText()+jTy1.getText()+jTl1.getText()+jTb1.getText()+"#",
data1 = "*"+jTx2.getText()+jTy2.getText()+jTl2.getText()+jTb2.getText()+"#",
data2 = "*"+jTx3.getText()+jTy3.getText()+jTl3.getText()+jTb3.getText()+"#",
data3 = "*"+jTx4.getText()+jTy4.getText()+jTl4.getText()+jTb4.getText()+"#";
new SwingWorker<Void, String>() {
int messageInd = 0;
@Override
protected Void doInBackground() throws Exception {
//will be called on worker thread
try {
obj.writeData(selectedPort, data);
String RFID1=obj.readData(selectedPort);
push(RFID1);
System.out.println(RFID1);
} catch (SerialPortException ex) {
Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
}
try {
obj.writeData(selectedPort, data1);
String RFID2=obj.readData(selectedPort);
push(RFID2);
System.out.println(RFID2);
} catch (SerialPortException ex) {
Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
}
try {
obj.writeData(selectedPort, data2);
String RFID3=obj.readData(selectedPort);
push(RFID3);
System.out.println(RFID3);
} catch (SerialPortException ex) {
Logger.getLogger(RoboGUI.class.getName()).log(Level.SEVERE, null, ex);
}
try {
obj.writeData(selectedPort, data3);
String RFID4=obj.readData(selectedPort);
push(RFID4);
System.out.println(RFID4);
} catch (SerialPortException ex) {
}
return null;
}
@Override
protected void process(List<String> rfids) {
//will be called on ui thread
for(String rfid : rfids) {
if( messageInd==0 )
jTrfid1.setText(rfid);
else if( messageInd==1 )
jTrfid2.setText(rfid);
else if( messageInd==2 )
jTrfid3.setText(rfid);
else if( messageInd==3 )
jTrfid4.setText(rfid);
messageInd++;
}
}
}.execute();
}https://stackoverflow.com/questions/43260302
复制相似问题