infonode 的事件處理可以用下列的程式碼來監控,DockingWindowAdapter 已經內建所有事件處理函數,可以經由覆寫函數來增加處理機制。 rootWindow.addListener(new DockingWindowAdapter() { public void viewFocusChanged(View previouslyFocusedView, View focusedView) { System.out.println("focused:" + focusedView + " + pre:" + previouslyFocusedView); super.viewFocusChanged(previouslyFocusedView, focusedView); } });
  1. public void windowShown(DockingWindow) 當 DockingWindow 顯示時呼叫此函數。
    1. 由於 RootWindow 的 addListener 是在 RootWindow 建立之後才能加入,所以無法監控一開始的顯示狀態。
    2. 當一開始只有 TabWindow,再把一個 View 移出去,形成一個 SplitWindow 加二個 TabWindow 時,顯示順序為 SplitWindow → Left TabWindow → Right TabWindow,這里並沒有 View 的顯示喔,怪怪的。
    3. 另外在 TabWindow 內切換 View 時,會呼叫 windowShown(View),接著在呼叫 viewFocusChanged 取得焦點,此時又有 View 的顯示事件;但是如果直接按 close 按鈕結束顯示中的 View 並切換到下一個 View 時,卻沒有呼叫 windowShown(View),都是有 View 顯示,卻有不同的事件,真是奇怪。

  2. public void windowHidden(DockingWindow) 當 DockingWindow 隱藏時呼叫此函數。
    1. 當一開始只有 TabWindow,再把一個 View 移出去,形成一個 SplitWindow 加二個 TabWindow 時,順序為先隱藏 TabWindow 再顯示 SplitWindow → Left TabWindow → Right TabWindow,這里並沒有 View 的顯示喔,怪怪的。
    2. 另外在 TabWindow 內切換 View 時,會先呼叫 windowHidden(View) 再呼叫 windowShown(View),接著在呼叫 viewFocusChanged 取得焦點;但是如果直接按 close 按鈕結束顯示中的 View 並切換到下一個 View 時,卻會呼叫 windowHidden(View) 但沒有呼叫 windowShown(View),都是有 View 顯示,卻有不同的事件,真是奇怪。

  3. public void viewFocusChanged(View, View) 當 View 焦點有變化時呼叫此函數。
    實驗時,發現如果 View 內只有一個 JLabel 元件,點擊在 JLable 上,並不會讓 View 取得焦點;如果 View 內是 JButton 元件,則點擊 JButton 會讓 View 取得焦點。看起來似乎會依據 Swing 元件是否取得焦點來決定 View 是否取得焦點。

  4. public void windowAdded(DockingWindow, DockingWindow)
    當一開始只有 TabWindow,再把 View1 移出去,形成一個 SplitWindow 加二個 TabWindow 時,從 addto SplitWindow 發現,View1 已經被加入了 SplitWindow 才呼叫 windowAdded 函數,但是在 SplitWindow 加入 RootWindow 前,並未加入 View。

  5. public void windowRemoved(DockingWindow, DockingWindow) 當 DockingWindow 被移轉到另一個 DockingWindow 時呼叫此函數。

  6. public void windowClosing(DockingWindow) 當 DockingWindow 被移除關閉開始時呼叫此函數。
    如果只是移轉到另一個 DockingWindow 並不會發生 windowClosing,只有當真的從 RootWindow 不見才會呼叫此函數。

  7. public void windowClosed(DockingWindow) 當 DockingWindow 被移除關閉結束時呼叫此函數。
    如果只是移轉到另一個 DockingWindow 並不會發生 windowClosing,只有當真的從 RootWindow 不見才會呼叫此函數。

  8. 如果同時產生很多事件,其呼叫順序為 windowHidden → windowShown → viewFocusChanged →→→→→→→→→。

當一開始只有 TabWindow,再把 View1 移出去,形成一個 SplitWindow 加二個 TabWindow,完整動作如下: hidden:net.infonode.docking.TabWindow+View 0, View 1, View 2, View 3, View 4 removedFrom:net.infonode.docking.RootWindow+<br/> removed:net.infonode.docking.TabWindow+View 0, View 1, View 2, View 3, View 4 addto:net.infonode.docking.RootWindow+<br/> added:net.infonode.docking.SplitWindow+ shown:net.infonode.docking.SplitWindow+ addto:net.infonode.docking.SplitWindow+View 1, View 0, View 2, View 3, View 4 added:net.infonode.docking.TabWindow+View 1 shown:net.infonode.docking.TabWindow+View 1 addto:net.infonode.docking.SplitWindow+View 1, View 0, View 2, View 3, View 4 added:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 shown:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 接著再把 View1 undock 變成一個FloatingWindow,完整動作如下: undocking:net.infonode.docking.View+View 1 hidden:net.infonode.docking.View+View 1 removedFrom:net.infonode.docking.TabWindow+ removed:net.infonode.docking.View+View 1 hidden:net.infonode.docking.TabWindow+ removedFrom:net.infonode.docking.SplitWindow+View 0, View 2, View 3, View 4 removed:net.infonode.docking.TabWindow+ hidden:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 removedFrom:net.infonode.docking.SplitWindow+ removed:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 hidden:net.infonode.docking.SplitWindow+ removedFrom:net.infonode.docking.RootWindow+View 0, View 2, View 3, View 4 removed:net.infonode.docking.SplitWindow+ addto:net.infonode.docking.RootWindow+View 0, View 2, View 3, View 4 added:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 shown:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 undocked:net.infonode.docking.View+View 1 addto:net.infonode.docking.RootWindow+View 0, View 2, View 3, View 4, View 1 added:net.infonode.docking.FloatingWindow+View 1 shown:net.infonode.docking.FloatingWindow+View 1 最後再把 View1 dock 回復成原來的 SplitWindow,動作裏很奇怪。
  1. 沒有 closing 事件,卻有 closed 事件,照理應是成雙出現。
  2. docked 卻出現二次,應該只有一次才對吧?
完整動作如下: docking:net.infonode.docking.View+View 1 hidden:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 removedFrom:net.infonode.docking.RootWindow+View 1 removed:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 addto:net.infonode.docking.RootWindow+View 1 added:net.infonode.docking.SplitWindow+ shown:net.infonode.docking.SplitWindow+ hidden:net.infonode.docking.View+View 1 removedFrom:net.infonode.docking.TabWindow+ removed:net.infonode.docking.View+View 1 docked:net.infonode.docking.View+View 1 addto:net.infonode.docking.SplitWindow+View 1, View 0, View 2, View 3, View 4 added:net.infonode.docking.TabWindow+View 1 shown:net.infonode.docking.TabWindow+View 1 addto:net.infonode.docking.SplitWindow+View 1, View 0, View 2, View 3, View 4 added:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 shown:net.infonode.docking.TabWindow+View 0, View 2, View 3, View 4 hidden:net.infonode.docking.TabWindow+ removedFrom:net.infonode.docking.FloatingWindow+ removed:net.infonode.docking.TabWindow+ hidden:net.infonode.docking.FloatingWindow+ removedFrom:net.infonode.docking.RootWindow+View 1, View 0, View 2, View 3, View 4 removed:net.infonode.docking.FloatingWindow+ closed:net.infonode.docking.FloatingWindow+ docked:net.infonode.docking.View+View 1 當一開始只有 TabWindow,再把 View0 刪除,完整動作如下: closing:net.infonode.docking.View+View 0 hidden:net.infonode.docking.View+View 0 removedFrom:net.infonode.docking.TabWindow+View 1, View 2, View 3, View 4 removed:net.infonode.docking.View+View 0 closed:net.infonode.docking.View+View 0

台南小新 發表在 痞客邦 PIXNET 留言(0) 人氣()