我有一个类,可以从串行端口接收和发送信息:
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
}
使用第三类从 Terminal
向 Gui
传递信息的正确方法是什么:
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
类在 Gui
和 Terminal
之间进行通信。
如果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/