gpt4 book ai didi

java - Java 中的 MVC 和事件监听器

转载 作者:行者123 更新时间:2023-11-29 05:33:31 24 4
gpt4 key购买 nike

我对如何在模型和 Controller 之间使用事件监听器感到有点困惑。我正在开发一个在客户端分为两部分的应用程序:客户端本身与服务器和 GUI 进行所有通信。客户端触发有关服务器更新的事件,而 gui 触发有关服务器感兴趣的用户操作的事件(该应用程序基本上是一个多用户图形编辑器)。所以我的问题:

  1. 我发现 GUI 更容易保留对客户端的引用,反之亦然,而不是触发事件和使用事件监听器。这通常是一种不好的做法吗?

  2. 现在,如果我们实际使用事件,我会对实现感到困惑。所以我创建了一些我将要新建的事件类型(drawEvent、connectionEvent 等)。然后我实现了一个 ClientListener 和一个具有特定行为的 GUIListener。现在,我该如何触发事件?我从阅读中了解到,为了让 GUI 触发某些东西,它需要调用 clientListener.eventHappened(event),对吗?所以它需要有那个监听器,即客户端和 GUI 必须共享监听器(似乎比仅引用更复杂)?最后,我如何实际将 GUIListener 的实例添加到 gui?再次从我读到的内容来看,我必须创建一个 EventListenerList 属性并在那里添加一个新的 GUI 监听器实例?是吗?我不明白这将如何触发实际聆听。

抱歉,我只是在学习所有这些东西,并没有完全理解。谢谢!

最佳答案

不确定您的设计是否最好,但编写自己的监听器/事件相当容易。

例如。你首先为监听器定义一个接口(interface),为事件定义一个类

public class MyCustomEvent extends EventObject{
//store all relevant info in your event
}

public interface MyListener{
public void eventHappened( MyCustomEvent event);
}

然后,如果您有一个要附加监听器的类,您只需要有方法来添加监听器,并在需要时在这些监听器上调用 eventHappened 方法

public class MyClassWhichFiresEvents{
private final List<MyListener> listeners =
new CopyOnWriteArrayList<MyListener>();

public void addListener( MyListener listener ){
listeners.add( listener );
}

public void removeListener( MyListener listener ){
listeners.remove( listener );
}
//call this method whenever you need to fire an event
private void fireEvent( MyCustomEvent event ){
for ( MyListener listener : listeners ){
listener.eventHappened( event );
}
}
}

如果您想知道 CopyOnWriteArrayList 来存储监听器。当您遍历听众以触发事件时,其中一个听众可能会自行删除。所以典型的解决方案是首先将所有监听器复制到另一个列表中,然后迭代该列表,或者使用 CopyOnWriteArrayList

关于java - Java 中的 MVC 和事件监听器,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20293334/

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