gpt4 book ai didi

Java GUI与串口通信

转载 作者:行者123 更新时间:2023-12-01 22:19:51 24 4
gpt4 key购买 nike

我有一个类,可以从串行端口接收和发送信息:

public class Terminal implements Runnable
{
static LinkedList<String> receiver = new LinkedList<String>();
public Terminal()
{
//...
}
public String getReceivedMessage()
{
String data = receivedMessfges.removeFirst();
return data;
}
// Other function that perform connection to COM port
// ...
}

我还有基于 Swing 的 gui 类:

public class Gui extends JFrame
{
// Functions that display information, received from COM port
}

使用第三类从 TerminalGui 传递信息的正确方法是什么:

public class Monitor
{
static Gui gui;
static terminal terminal;
public static void main(String args[])
{
monitor = new Monitor();
}
public Monitor()
{
gui = new Gui();
terminal = new Terminal();
}
// Functions, that get information COM port
// using getReceivedMessage() function
// and display it on Gui
}

谢谢)

最佳答案

我将使用 Monitor 类在 GuiTerminal 之间进行通信。

如果receivedMessfges.removeFirst();在收到应显示在GUI中的完整消息之前没有返回,您可以这样做:

Thread messageChecker = new Thread(new Runnable() {
public void run() {
while (!Thread.isInterrupted()) {
String message = terminal.getReceivedMessage();
// Prepare message for gui display
SwingUtilities.invokeLater(new Runnable() {
public void run() {
gui.methodToDisplayTheReceivedMessage(message);
}
}
}
}
}).start();

Monitor 类中的某个位置。

该代码执行以下操作:

  • 创建一个新的Runnable(匿名类)
    • 使用 run() 方法,我们在其中
      • 检查线程是否被中断
      • 如果有,请停止
      • 如果还没有,请等待我们收到来自 的新消息并将其发送到 GUI。
  • 创建一个新的线程集来执行新 Runnable 的 run() 方法
  • 启动此话题。
  • 将对线程的引用分配给变量 messageChecker

要停止线程,只需调用 messageChecker.interrupt();

另一方面,如果 terminal.getReceivedMessage(); 仅返回部分消息,即在我们调用它之前收到的消息,我认为最好的方法是使用观察者模式。

  • 使终端类实现接口(interface) Observable
  • 使 Monitor 类实现接口(interface) Observer

然后,您需要编写代码,以便在终端类收到完整消息时通知观察者一条完整消息。我建议在终端类内部有一个线程定期检查新数据。一旦它有一个完整的消息,它应该调用 notifyObservers(message) (message 显然是一个包含完整消息的 String 类型的变量)消息)。

在 Monitor 类中,您必须有一个 update(Observable o, Object arg) 方法来满足 Observer 接口(interface):

// In the Monitor class
void update(Observable terminal, Object message) {
SwingUtilities.invokeLater(new Runnable() {
gui.methodToDisplayTheReceivedMessage((String)message); // This cast is safe, since we only ever call notifyObservers() with a string argument.
}
}

最后但并非最不重要的一点是,您需要从 Monitor 类(可能是从构造函数)调用 terminal.addObserver(this);,否则 notifyObservers() 将通知所有 0 个观察者,但什么也没有发生。

谷歌搜索“java观察者模式”会产生大量有用的资源和示例,以防您想了解更多信息。

关于Java GUI与串口通信,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30100354/

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