我經常實現一些面板,它們提供了像控件一樣的常用功能。爲此,我希望能夠添加偵聽器,以便調用者可以附加到控件並獲取有關更改的通知。如何正確地將ActionListeren添加到自定義JComponent中
到目前爲止,我只是簡單地使用我自己的List
,在那裏我保持聽衆,當我想要觸發一個動作時,我循環訪問列表並調用監聽器。從外部看,這基本上看起來像其他Swing
控制,但我想知道這是否真的應該使用的方法。
特別是我想知道是否在循環中調用聽衆本身也是Swing
,或者如果有某種類型的隊列將放置操作,以便Swing
決定何時執行此類操作。
當我investiaged這個我遇到了這個代碼:
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
直接訪問的成員,whcih感覺有點怪怪的。但是到目前爲止我還沒有找到更好的方法。還加入了新的監聽器,這個時候,我現在就做如下圖所示,但我不知道這是否真的是用適當的方式:
public void addQueryListener(ActionListener oListener)
{
listenerList.add(ActionListener.class, oListener);
}
public void removeQueryListener(ActionListener oListener)
{
listenerList.remove(ActionListener.class, oListener);
}
所以我想知道,在訪問listenerList
成員添加和刪除偵聽器的正確方法,以便它們像任何其他標準控件一樣工作?還是有一些best practice
這應該怎麼做,我到目前爲止失蹤?
我想這是我從哪裏開始發射事件的樣本,因爲我不記得我發現它的具體位置。那麼,訪問listenerList似乎是一種方式,即使直接訪問成員感覺有點奇怪。 :) – Devolus
我已經看到它在'JComponent'子類中使用,也像'JFreeChart'一樣。 –