java如何使用事件解耦networkmanager?
我正在编写一个与各种TCP网络设备连接的程序。GUI是使用JavaFX制作的。整个连接部分都在自己的包“网络”中。大致描述如下:(我对UML不太了解,不要怪plaese:/-我只需要一种方法来快速描述我的程序结构)http://i.stack.imgur.com/PSdsH.jpg
好吧,就是这样: TCP类存储在“NetworkManager”中的同步列表中。这些类保存有关连接的信息(已接收的数据量、ip、mac等)。Rcv线程不断尝试接收数据
这就是我想要的: 一旦Rcv线程接收到特定消息,就应该调用控制器来执行某些操作(GUI刷新或其他操作)。此外,控制器应与“网络”模块保持解耦->;它在另一个项目中重用。我希望通过自定义事件实现此行为。简而言之:TCP Rcv线程需要能够向控制器提供信息但我真的不知道如何让这一切都发挥作用。让我们看看我在哪里:
我在“网络”模块中有一个事件类
import java.util.EventObject; public class XEvent extends EventObject{ String message; public XEvent(Object source, String message) { super(source); this.message = message; } public String getMessage() { return message; } }
我在“网络”模块中有一个侦听器类
import java.util.EventListener; public interface XListener extends EventListener{ void handlerMethod1(XEvent event); void handlerMethod2(XEvent event); }
我试图为触发事件准备Rcv线程:
^{3}控制器(此类应对自定义事件作出反应)实现侦听器:
public class Controller implements Initializable, XListener { @Override public void handlerMethod1(XEvent event) { System.out.println("Event1: " + event.getMessage()); } @Override public void handlerMethod2(XEvent event) { } }
从那时起,我不再真正了解舒尔如何让我的事件(从我的Rcv线程触发)被我的控制器类注意到。我想我必须通过控制器类向每个Rcv线程对象添加一个监听器(就像使用ButtonListener,…)。问题是:在TCP类中,即使设置为public,我也无法访问Rcv线程对象的addXListener方法-(但我可以从列表中访问Rcv线程类)。我试着尽可能多地阅读关于这个问题的文章,但不知道如何让它起作用。我错过了什么
edit1:TCP类:
public class TCPClass{
private Thread receiveDataThread;
private String MAC;
private InetAddress IP;
private Socket socket = new Socket();
private int tcpSendPort;
private int timeOut = 10;
private ObjectOutputStream objectOutputStream;
private BufferedReader bufferedReader;
private String connectionStatus = "offline";
public TCPClass(DatagramPacket datagramPacket) {
IP = datagramPacket.getAddress();
setConnectionStatusOnline();
tcpSendPort = 50000 + NetworkManager.getNumberOfConnections();
MAC = extractMac(datagramPacket);
}
public void connect(int tcpPort) {
try {
socket = new Socket(IP, tcpPort, null, tcpSendPort);
bufferedReader = new BufferedReader(new InputStreamReader(socket.getInputStream()));
receiveDataThread = new Thread(new ReceiveDataThread(this));
receiveDataThread.start();
InputStreamReader(socket.getInputStream()));
} catch (IOException e) {
e.printStackTrace();
System.out.println("on MAC: " + getMAC() + "\non Device:" + toString());
}
if (socket.isConnected()) {
setConnectionStatusConnected();
}
}
}
NetworkManager创建一个TCPClass对象并调用connect()方法
# 1 楼答案
好吧,几天后我自己就明白了。 主要问题是我无法从控制器调用Rcv线程的addXListener()方法。我将自定义事件从Rcv线程中取出,并将其移动到TCP类中。现在我可以将侦听器添加到这些类中。如果我想从Rcv线程触发一个事件,我只需从它的超类(TCP类)调用fireHandlerMethod(),一切都按预期进行