2011-11-23 5 views
5

내 모델이 뒷받침하는 Sun의 예제 JTreeTable을 약간 수정 한 버전을 사용하고 있습니다. 세 번째 예가 될 것입니다 (북마크 하나는 http://java.sun.com/products/jfc/tsc/articles/bookmarks/).JTreeTable DnD 깜박임 드롭 커서가 깜박임

끌어서 놓기 지원을 제외한 모든 기능이 예상대로 작동합니다. 나는 JTree이 제공하는 것과 비슷한 DDN을 원했다. JTreeTable은 확장 된 JTable이므로 JTreeTable (경로가없고 자식 색인이 없음)의 트리 렌더링 된 열에 물건을 떨어 뜨릴 때 충분한 정보를 제공하지 않는 놓기 위치를 결정하기 위해 JTable.DropLocation 클래스를 제공합니다. 나는 이미 JTableJTree 버전의 조합을 기반으로하는 맞춤형 DropLocation 클래스를 만들어 해결했습니다. 또한이 새로운 정보를 사용자에게 보여주기 위해 JTreeTable 구현에 의해 제공되는 TreeTableCellRenderer 클래스의 페인트 메소드를 수정했습니다 (이제는 새 노드가 선택된 노드의 앞이나 뒤에 배치되는지 확인할 수 있음). 나무 열 안쪽에 있으면 JTree에서 예상 한대로).

한 가지 문제가 있습니다. 드롭 위치가 트리 열 내에 렌더링 될 때 마우스 커서가 미쳐 버립니다. 나타나는 후 몇 밀리 세컨드 후에 사라지거나 드래그 커서가 보이지 않을 정도로 빨라집니다. 이것은 수정되지 않은 Sun의 예에서도 마찬가지입니다. 나는 왜 이것이 일어나고 있는지에 관해서는 완전히 어둠 속에있다. http://www.java.net/node/663106에서 같은 문제가있는 다른 사람을 찾았지만 제공된 솔루션에서 해당 구성 요소의 놓기 위치를 null로 설정 한 것으로 보이며 더 이상 JTreeTable.getDropLocation() 메서드를 사용하여 검색 할 수 없습니다. 내 수정 된 DropLocation로 변환하고 다음을 기반으로 물건을 페인트이 필요합니다. 필자는 유스 케이스의 적절한 솔루션에 너무 가까워서 맛볼 수 있습니다. 이 커서 깜박 거리는 것은 내 방식에서 유일한 장애물입니다. 어떤 아이디어?

Java 1.6을 사용 중입니다.

PS : 나는 JTable.DropLocation 문제로 고통되는 모두 표시하기 때문에 (넷빈즈 개요 또는 JXTreeTable 같은) 기존의 구성 요소 중 하나에 대한 사용자 지정 JTreeTable하지에 대한 결정했습니다 및 이전 또는 이후에 삭제에 대한 지원을 제공하지 않습니다 선택된 트리 노드 (내부 노드). 이러한 기능을 제공하는 구성 요소에 대해 알고 있다면 기쁜 마음으로 들어 볼 수 있습니다.

+1

이 질문의 포스트 scriptum에서 내가 부당하게 이전 또는 선택 트리 노드 후 하락 지원할 수 없다는'org.netbeans.swing.Outline'와'JXTreeTable' 비난 . 이러한 구성 요소가 실제로이를 지원하기 때문에 사실이 아닙니다. 이것들은 모두 JTable을 간접적으로 서브 클래스 화합니다. 'JTable.DropLocation'는 패스 정보를 제공하지 않는 것이 사실이지만, 테이블 정보와 함께 제공되는 테이블 행과 컬럼을 통해 얻을 수 있습니다. 내가 이것을 알았 더라면, 나는 내 자신의 구성 요소를 굴리는 것을 결코 괴롭히지 않았을 것이다. 나는 그것을 반대한다. – predi

답변

7

코어 버그 #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

실제로. 이것은 정답입니다. 항상 false를 돌려주는 TreeTableCellRenderer.isVisible()를 오버라이드 (override)하면 (자) 트릭을 실행합니다. – predi