有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

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) 个答案

  1. # 1 楼答案

    好吧,几天后我自己就明白了。 主要问题是我无法从控制器调用Rcv线程的addXListener()方法。我将自定义事件从Rcv线程中取出,并将其移动到TCP类中。现在我可以将侦听器添加到这些类中。如果我想从Rcv线程触发一个事件,我只需从它的超类(TCP类)调用fireHandlerMethod(),一切都按预期进行