2011-11-23 64 views
5

我使用的是我自己的模型支持的Sun示例JTreeTable的稍微修改版本。這將是第三個例子(http://java.sun.com/products/jfc/tsc/articles/bookmarks/處的書籤)。JTreeTable DnD瘋狂閃爍放置光標

除拖放支持外,一切均按預期工作。我想DnD更像是JTree提供的。由於JTreeTable是擴展JTable,因此它提供JTable.DropLocation類來確定放置位置,該位置在將東西放入JTreeTable(無路徑和無子索引)的樹渲染列中時不提供足夠的信息。我已經通過創建基於JTableJTree版本組合的自定義DropLocation類來解決此問題。我還修改了上述JTreeTable實現提供的TreeTableCellRenderer類的paint方法,以向用戶顯示此新信息(她現在可以查看新節點是否放置在選定節點之前或之後如果在樹列內,就像您期望從JTree期望的那樣)。

雖然有一個問題。當放置位置在樹列內呈現時,鼠標光標變得瘋狂。它在數毫秒後出現然後消失,或者這種情況發生得如此之快,甚至沒有顯示拖動光標。這也發生在未經修改的Sun的例子中。我完全處於黑暗中,爲什麼會發生這種情況。在http://www.java.net/node/663106找到了另一個具有相同問題的人,但是提供的解決方案似乎將組件的放置位置設置爲空,並且無法使用JTreeTable.getDropLocation()方法檢索。我需要這個將它轉換爲我修改後的DropLocation,然後根據它來繪製東西。 我非常接近我的使用案例的適當解決方案,我可以品嚐它。這個光標閃爍的東西是我的唯一障礙。有任何想法嗎?

使用Java 1.6。

PS:我已經決定自定義JTreeTable而不是現有的組件(如Netbeans的輪廓或JXTreeTable),因爲它們都出現一個從JTable.DropLocation問題的痛苦和不提供之前或之後下探支撐選定的樹節點(只在裏面)。如果你知道一個提供這種功能的組件,我很樂意聽到它。

+1

在這個問題上的郵政Scriptum我錯誤地指責'不能夠支持之前或選定樹節點後下降的org.netbeans.swing.Outline'和'JXTreeTable' 。這不是事實,因爲這些組件事實上支持它。它們都間接地繼承了一個JTable。雖然'JTable.DropLocation'確實不提供路徑信息,但您始終可以通過它提供的錶行和列來獲取它。如果我知道這一點,我將永遠不會打擾我自己的組件。我建議反對它。 – predi

回答

7

這聽起來像是一個核心bug #6700748(無法驗證,該補丁錯誤遊行需要年齡來連接..)。因此,從修復理由是JXTreeTable:

/** 
    * {@inheritDoc} <p> 
    * 
    * Overridden to hack around #766-swingx: cursor flickering in DnD 
    * when dragging over tree column. This is a core bug (#6700748) related 
    * to painting the rendering component on a CellRendererPane. A trick 
    * around is to let this return false. <p> 
    * 
    * This implementation applies the trick, that is returns false always. 
    * The hack can be disabled by setting the treeTable's client property 
    * DROP_HACK_FLAG_KEY to Boolean.FALSE. 
    * 
    */ 
    @Override 
    public boolean isVisible() { 
     return shouldApplyDropHack() ? false : super.isVisible(); 
    } 


    /** 
    * Returns a boolean indicating whether the drop hack should be applied. 
    * 
    * @return a boolean indicating whether the drop hack should be applied. 
    */ 
    protected boolean shouldApplyDropHack() { 
     return !Boolean.FALSE.equals(treeTable.getClientProperty(DROP_HACK_FLAG_KEY)); 
    } 
+0

確實。這是正確的答案。重寫TreeTableCellRenderer.isVisible()總是返回false會有訣竅。 – predi