gpt4 book ai didi

java - JTextField 未从串行端口更新

转载 作者:行者123 更新时间:2023-12-02 11:56:22 25 4
gpt4 key购买 nike

我正在尝试编写软件来从三个 RS232 串行端口读取数据,并且我编写了一些代码来提供有关程序实际监听哪个端口的视觉反馈。我知道该程序正在监听 COM1,因为我已将其打印到控制台以告诉我它正在监听哪个端口。问题是它没有更新 JTextFields 来通知实际 GUI 中的用户。我写的代码如下:

if (Serial.currPortId == (null)) {
listenState.setText("NONE");
listenState.revalidate();
}
while (Serial.currPortId != (null)) {
listenState.setText(Serial.currPortId.getName());
listenState.revalidate();
if (Serial.currPortId.getName().equals("COM1")) {
tab1sheet.setText(ImportMenu.serialImport.datafeed);
tab1sheet.revalidate();
}
else if (Serial.currPortId.getName().equals("COM2")) {
tab2sheet.setText(ImportMenu.serialImport.datafeed);
tab2sheet.revalidate();
}
else if (Serial.currPortId.getName().equals("COM3")) {
tab3sheet.setText(ImportMenu.serialImport.datafeed);
tab3sheet.revalidate();
}
else {tab1sheet.setText("N/A");
tab1sheet.revalidate();
tab2sheet.setText("N/A");
tab2sheet.revalidate();
tab3sheet.setText("N/A");
tab3sheet.revalidate();
}
}

出于某种原因,它只是将“listenState”字段设置为 NONE,然后不更新,尽管声称正在控制台中监听 COM1。

最佳答案

您的代码违反了 Swing 线程规则。它可能试图在 Swing 事件线程上运行监听代码(我们无法根据您发布的代码片段来判断),但它肯定试图以线程错误的方式更新文本字段。相反,我建议您使用 SwingWorker 来监听后台线程中的端口,特别是 SwingWorker<Void, String>使用发布/处理方法对将文本发送到 JTextArea。或者,如果您需要使用传递到 GUI 多个位置的更复杂信息来更新 GUI,则可以通过将 PropertyChangeListener 附加到 SwingWorker 来完成此操作,这将通知所有监听器(GUI)工作器状态的更改。

有关更多信息,请查看Lesson: Concurrency in Swing

您的代码可能看起来像这样:

class MyWorker extends SwingWorker<Void, Void> {
// properties to listen for changes to:
public static final String LISTEN_STATE = "listen state";
public static final String CURRENT_PORT_ID = "current port id";
public static final String DATA_FEED = "data feed";
private String listenState = "None";
private String dataFeed = "";
private String currentPortId = "";

@Override
protected Void doInBackground() throws Exception {
while (true) {
if (Serial.currPortId != (null)) {
// change properties when data comes in
String currPortId = Serial.currPortId.getName();
setListenState(currPortId);
setCurrentPortId(currPortId);
setDataFeed(ImportMenu.serialImport.datafeed);
} else {
setListenState("None");
break; // ??
}
}
return null;
}

public String getListenState() {
return listenState;
}

public void setListenState(String listenState) {
// set the prop change parameters
String oldValue = this.listenState;
String newValue = listenState;

// update the propertie's state
this.listenState = listenState;

// notify listeners of the change
firePropertyChange(LISTEN_STATE, oldValue, newValue);
}

public String getDataFeed() {
return dataFeed;
}

public void setDataFeed(String dataFeed) {
// same rationale as for the other setter method
String oldValue = this.dataFeed;
String newValue = dataFeed;
this.dataFeed = dataFeed;
firePropertyChange(DATA_FEED, oldValue, newValue);
}

public String getCurrentPortId() {
return currentPortId;
}

public void setCurrentPortId(String currentPortId) {
// same rationale as for the other setter method
String oldValue = this.currentPortId;
String newValue = currentPortId;
this.currentPortId = currentPortId;
firePropertyChange(CURRENT_PORT_ID, oldValue, newValue);
}
}

然后您可以附加一个响应更改的监听器,然后更新 GUI 中的显示

private class MyWorkerListener implements PropertyChangeListener {
@Override
public void propertyChange(PropertyChangeEvent evt) {
switch (evt.getPropertyName()) {
case MyWorker.LISTEN_STATE:
String listenState = evt.getNewValue().toString();
// show in text field
break;
case MyWorker.CURRENT_PORT_ID:
String currentPortId = evt.getNewValue().toString();
// use this to decide which tab to change to
break;
case MyWorker.DATA_FEED:
String dataFeed = evt.getNewValue().toString();
// show where needed
break;

default:
break;
}
}
}

你可以在 GUI 中将其连接起来,如下所示:

MyWorker worker = new MyWorker();
worker.addPropertyChangeListener(new MyWorkerListener());
worker.execute();

您还想向 SwingWorker 添加另一个 PropertyChangeListener 以监听 SwingWorker.StateValue.DONE newValue,当它发生时,调用 get()让工作人员捕获并处理任何异常

关于java - JTextField 未从串行端口更新,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47577820/

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