2012-02-14 2 views
1

노드에서 JButton을 추출하고이를 JTree로 출력하는 간단한 TreeCellRenderer가 있습니다.CPU를 먹는 TreeCellRenderer

public class ButtonCellRenderer extends JButton implements TreeCellRenderer { 

    @Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean  selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
    //setBackgroundNonSelectionColor(tree.getBackground()); 
    ProgressButton b = null; 
    if ((value != null) && (value instanceof DefaultMutableTreeNode)) { 
     Object userObject = ((DefaultMutableTreeNode) value).getUserObject(); 
     if (userObject instanceof ProgressButton) { 
     b = (ProgressButton) userObject; 
     return b; 
     } 
    } 
    if (b == null) { 
     System.out.println("Null!"); 
     DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); 
     return defaultRenderer.getTreeCellRendererComponent(tree, 
       value, selected, expanded, leaf, row, hasFocus); 
    } else { 
     System.out.println("Returning label"); 
     return new JLabel(b.getToolTipText(), b.getIcon(), SwingConstants.CENTER); 
    } 
    } 
} 

왜 그런지 모르겠지만 루핑이 느려지고 약 30 ~ 50 %의 CPU를 먹습니다. 이것을 제거 할 수있는 방법이 있습니까? 또는 JButton을 트리로 출력하기 위해 렌더러를 사용할 필요가 없습니까?

위의 수정 된 코드를 추가했지만 버튼이 올바르게 표시되지 않는 문제가 발생합니다 (모두 작은 것으로 나타남).

+1

처음에는 'super' 메소드를 호출하는 이유는 무엇입니까? (아마도 문제는 아니지만 과장된 것처럼 보입니다.) – millimoose

+0

저는 완전히 확신 할 수 없습니다. 제가 본 예에서 보았습니다. 나는 그것을 간과 한 것 같습니다. 그러나 제거는 많은 일을하지 않는 것처럼 보입니다. – Fallso

+2

은 매번 새 레이블을 만들지 않습니다 (효과는 30/50 %만큼 커서는 안 됨). 유효성 검사는 불필요합니다 (결국 레이블 일뿐입니다). ProgressButton이란 무엇입니까? 백그라운드에서 뭔가 더러워지면 어떨까요? – kleopatra

답변

5

값을 저장하지 않고 super.getTreeCellRendererComponent으로 전화를 걸었습니다. 나중에 렌더러가 만들어지지 않으면이 메서드를 다시 호출하십시오 (if c==null...). 이것은 그 자체로 비싸다.

더 중요 렌더러 재사용에만 도시되는 특정 값으로 구성되는 성분이어야

. 이것이 기본 구현이 레이블을 재사용하고 텍스트, 색상, 테두리를 설정하는 이유입니다. 그래서 렌더러 호출이 매우 저렴합니다.

값을 표시 할 때마다 JLabel을 새로 만듭니다. returnLab = new JLabel(text);. 이것은 비싸다. 이 메서드는 각 repaint 이벤트에 표시된 모든 셀마다 호출됩니다. 이것은 컴포넌트 그리드를 만드는 것보다 훨씬 비싸며 렌더러 컨셉의 모든 목적을 무시합니다.

올바르게 수행하는 방법을 보려면 기본 렌더러 구현을 살펴보십시오. tutorial을 살펴보세요.

+0

감사하지만, 지금은 그 오류를 수정했습니다. 내가하고 싶은 것은 JButton을 JTree에 표시하는 것입니다. 렌더러를 사용하는 것이 유일한 방법이었습니다. – Fallso

+0

JButton을 렌더러로 사용하면 모든 호출에서 다시 만들지 않아도됩니다. 그리고 라이브 버튼이 아니라 "스탬프"되어 있기 때문에 setTooltip 호출이 쓸모없는 것입니다. 버튼이 필요하면 편집기를 작성하고 클릭 동작을 변경해야합니다. –

+0

+1 부분에 대해서 렌더러 – mKorbel

관련 문제