在 trace JTableHeader source code 時,怎麼都找不到有關處理 mouse event 的地方,看了半天也是不明所以。最後在 TableHeaderUI 裏才找到相關的 code,但是在 JTableHeader 找不到載入 TableHeaderUI 的地方。還好,看到了 netbaixc 所寫的"JAVA Painting-Swing实现纪要一",才明暸如何載入 TableHeaderUI。

  1. javax\swing\table\JTableHeader.java
    在 JTableHeader(TableColumnModel cm) 內執行 updateUI()。
  2. javax\swing\table\JTableHeader.java
    在 updateUI() 內執行 setUI((TableHeaderUI)UIManager.getUI(this))。
  3. javax\swing\UIManager.java
    在 getUI(JComponent target) 內執行 ui = getDefaults().getUI(target)。
  4. javax\swing\UIManager.java
    在 getDefaults() 內執行 return getLAFState().multiUIDefaults。
    multiUIDefaults 是屬於 MultiUIDefaults 類別(javax\swing\MultiUIDefaults.java)。
    MultiUIDefaults extends UIDefaults(javax\swing\UIDefaults.java)。
  5. javax\swing\UIDefaults.java
    在 getUI(JComponent target) 內執行 target.getUIClassID() 取得 JTableHeader 的字串變數 uiClassID。
    在經由 getUIClass(target.getUIClassID(), uiClassLoader) 取得類別。
    接著經由 uiClass.getMethod("createUI", new Class[]{acClass}) 取得 createUI 函數。
    最後透過 MethodUtil.invoke(m, null, new Object[]{target}) 執行 createUI 來取得 uiObject 物件。
  6. javax\swing\table\JTableHeader.java
    在 setUI() 內檢查目前的 ui 跟 UIManager.getUI 是否一致;當然一開始 ui 為 null,所以一定不同。
    如果有變化則執行 super.setUI(ui) 並重畫元件。
    ui 是從 JComponent 繼承而來的變數。
  7. javax\swing\JComponent.java
    在 setUI 內先執行 ui.uninstallUI(this) 解除安裝 ui。
    再執行 ui.installUI(this) 來安裝新的 UI

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