gpt4 book ai didi

java - 如何正确地将 ActionListeren 添加到自定义 JComponent

转载 作者:行者123 更新时间:2023-11-30 09:19:59 24 4
gpt4 key购买 nike

我经常实现一些面板,它们提供控件等常用功能。为此,我希望能够添加监听器,以便调用者可以附加到控件并获得有关更改的通知。

到目前为止,我只是使用了自己的 List 来保存监听器,当我想触发一个 Action 时,我循环遍历列表并调用监听器。从外面看,这基本上看起来像任何其他 Swing 控件,但我想知道这是否真的是应该使用的方法。

特别是我想知道 Swing 本身是否也在循环中调用监听器,或者是否有某种队列可以放置操作,以便 Swing 决定何时执行此类操作。

当我对此进行调查时,我发现了这段代码:

protected void fireActionPerformed(ActionEvent event)
{
Object[] listeners = listenerList.getListenerList();
ActionEvent e = null;

// Process the listeners last to first, notifying
// those that are interested in this event
for (int i = listeners.length-2; i>=0; i-=2)
{
if(listeners[i] instanceof ActionListener)
{
// Lazily create the event:
if (e == null)
{
String actionCommand = event.getActionCommand();

e = new ActionEvent(this,
ActionEvent.ACTION_PERFORMED,
actionCommand,
event.getWhen(),
event.getModifiers());
e.setSource(event.getSource());
}
((ActionListener)listeners[i+1]).actionPerformed(e);
}
}
}

直接访问JComponent中的成员listenerList,感觉有点奇怪。但是到目前为止我还没有真正找到更好的方法。此外,在为此添加新的监听器时,我现在如下所示进行操作,但我不确定这是否真的是合适的方法:

public void addQueryListener(ActionListener oListener)
{
listenerList.add(ActionListener.class, oListener);
}

public void removeQueryListener(ActionListener oListener)
{
listenerList.remove(ActionListener.class, oListener);
}

所以我想知道,访问 listenerList 成员是否是添加和删除监听器的正确方法,以便它们的行为与任何其他标准控件一样?或者是否有一些最佳实践应该如何完成,这是我目前所缺少的?

最佳答案

记住 Swings 对创建图形用户界面的限制。访问没有坏处** listenerlist ** 这样。可能这不是最好的方法。Swing 假设是单线程的并且不是线程安全的。

http://codeidol.com/java/java-concurrency/GUI-Applications/Why-are-GUIs-Single-threaded/

AddListener 和 RemoveListener 需要在 EDT(Event Dispatch Thread) 上调用请参阅 http://en.wikipedia.org/wiki/Event_dispatching_thread .

另请参阅 Listenere 的迭代,即当您调用 getActionListeners 时

它创建一个 ListenersList 的副本并返回给你

下面来自 EventListenerList 的代码

public <T extends EventListener> T[] getListeners(Class<T> t) {
Object[] lList = listenerList;
int n = getListenerCount(lList, t);
T[] result = (T[])Array.newInstance(t, n);
int j = 0;
for (int i = lList.length-2; i>=0; i-=2) {
if (lList[i] == t) {
result[j++] = (T)lList[i+1];
}
}
return result;
}

关于java - 如何正确地将 ActionListeren 添加到自定义 JComponent,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17672800/

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