我有Class,它从串口接收和发送信息:
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
}
感谢)
答案 0 :(得分:2)
我会使用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
班内的某个地方。
代码执行以下操作:
run()
方法
run()
方法
messageChecker
。要停止线程,只需拨打messageChecker.interrupt();
。
另一方面,如果terminal.getReceivedMessage();
仅返回部分消息,即在我们调用它之前收到的消息,我认为最好的方法是使用观察者模式。
Observable
Observer
然后,您需要编写代码,以便在终端类具有完整消息时立即通知观察者。我建议让Terminal类内部的Thread定期检查新数据。只要有完整的消息,就应该调用notifyObservers(message)
(message
显然是包含完整消息的String
类型的变量。)
在Monitor类中,您必须使用update(Observable o, Object arg)
方法来满足Observer
接口:
// 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个观察者并且没有任何反应。
Google搜索“java观察者模式”会产生大量有用的资源和示例,以防您想了解更多信息。
答案 1 :(得分:1)
您可以使用外部接口,例如将数据写入文件并从那里读取....