2012-06-20 7 views
0

JTree의 일부 노드 레이블은 일부 계산 후에 길이가 증가하는 카운터를 나타냅니다. 결과는 약어 (...)가됩니다. 모든 노드가 언제든지 레이블 크기를 변경할 수있는 트리가 있다고 가정 해보십시오.JTree - JLabel update

변경된 아이콘을 추적하고 추적 된 이벤트 및 진행 상황의 결과 인 레이블을 변경하기 위해 별도의 스레드에서 100ms마다 트리를 다시 그립니다 (tree.repaint()). 나는 repaint() 메소드를 모든 트리 노드에서 nodeChanged() 호출로 대체 한 접근법을 시도했다. 트리가 깜박이기 시작합니다.

노드 레이블을 새로운 길이로 업데이트하려면 무엇을해야합니까? 이미 DefaultTreeCellRenderer를 확장 중입니다.

public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
    DefaultMutableTreeNode node; 
    Object     nodeValue; 
    TestComponent   currentComponent; 

    super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 

    node  = (DefaultMutableTreeNode) value; 
    nodeValue = node.getUserObject(); 


    if(nodeValue instanceof TestComponent) { 
     currentComponent = (TestComponent) nodeValue; 
     setText(currentComponent.getLabel()); 

    }  
    return this; 
} 

"setText"로 문제를 "수정"하기 위해 해당 CellRenderer에서 무엇을해야합니까?

+1

무엇이 필요합니까 ----> [Swing and Renderers] (http://docs.oracle.com/javase/tutorial/uiswing/components/table.html#editrender)'JComboBox'에 대한 similair 개념 , JList, JTable, JTree, – mKorbel

+0

나는 판사가 아닙니다. 어쩌면 당신이 옳고, 답이 좋지 않을 것입니다. (나는 사용자 프로필을 체크하지 않을 것입니다.) 렌더러의 개념, 여기에서 렌더러 & PreferredSize – mKorbel

답변

3

나무는 시간 추적 이벤트 진행의 결과 레이블 아이콘을 변경하고 변경을 추적하기 위해 별도의 스레드에서 (tree.repaint()) 100ms마다, 다시 그릴

틀린 경우 TreeModel은 추적 된 이벤트를 기반으로 이벤트를 실행해야하며 JTree은 자동으로 업데이트됩니다. 이러한 변경 사항은 물론 EDT에서 발생해야하며 별도의 Thread이 아닙니다.

그리고 불행히도 JTree의 크기 (따라서 그에 포함 된 레이블의 크기)는 JTree이 포함 된 상위 컨테이너로 제한됩니다. 그리고이 크기는 JTree의 크기가 커지면 자동으로 커지지 않습니다.

+0

JTree를 JScrollPane에 넣으면 JTree의 preferredSize 크기가 결정됩니다. –

+0

@GuillaumePolet 실제로는 부모 컨테이너를 확대하는 것처럼 쉬운 가로로 스크롤해야하므로 가시성 문제가 해결되지 않습니다. 그래야 라벨이 더 이상 잘리지 않습니다. 또 다른 옵션은 다중 행 텍스트 영역을 선택하고 충분한 수직 공간을 원한다는 것입니다. – Robin

+0

실제로는 제 목적을 달성 할 수있는 충분한 공간이 있지만 길이가 늘어 나면 레이블은 어쨌든 잘립니다. 데이터와 gui가 엄격하게 분리되어 있기 때문에 추가 업데이트 스레드가 없으면 이벤트를 실행할 수있는 방법이 없습니다. ... – Schifty