2014-11-06 11 views
4

사용자 정의 selectionBackground를 JXTreeTable의 행에 설정하려고합니다. 사용자 정의 TreeCellRenderer를 설정하지 않으면이 작동합니다. 예제 에서처럼 추가로 설정하면 노드 텍스트의 selectionBackground가 기본 텍스트입니다. 어떤 아이디어를 어떻게 사용자 지정 하나 nodetext의 배경을 얻으려면? TreeCellRender 및 ColorHighlighter로 selectedBackground와 결합 된 JXTreeTable

import java.awt.Color; 

import javax.swing.Icon; 
import javax.swing.JFrame; 
import javax.swing.JScrollPane; 
import javax.swing.UIManager; 

import org.jdesktop.swingx.JXTreeTable; 
import org.jdesktop.swingx.decorator.ColorHighlighter; 
import org.jdesktop.swingx.decorator.HighlightPredicate; 
import org.jdesktop.swingx.renderer.DefaultTreeRenderer; 
import org.jdesktop.swingx.renderer.IconValue; 
import org.jdesktop.swingx.treetable.DefaultMutableTreeTableNode; 
import org.jdesktop.swingx.treetable.DefaultTreeTableModel; 

public class TestHighlighter { 

    public static void main(String[] args) { 
     JFrame frame = new JFrame(); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

     JScrollPane scrollPane = new JScrollPane(); 
     frame.setContentPane(scrollPane); 

     JXTreeTable treeTable = new JXTreeTable(new DefaultTreeTableModel(new DefaultMutableTreeTableNode("Test"))); 
     treeTable.setRootVisible(true); 
     scrollPane.setViewportView(treeTable); 

     DefaultTreeRenderer treeCellRenderer = new DefaultTreeRenderer(new IconValue() { 
      @Override 
      public Icon getIcon(Object value) { 
       return UIManager.getIcon("FileView.directoryIcon"); 
      } 
     }); 
     //Comment out next line and background is like set in Highlighter 
     treeTable.setTreeCellRenderer(treeCellRenderer); 

     treeTable.addHighlighter(new ColorHighlighter(HighlightPredicate.ALWAYS, null, null, Color.RED, null)); 

     frame.pack(); 
     frame.setVisible(true); 
    } 
} 

는 또한 노드의 아이콘을 변경 (사용자 정의의 TreeCellRenderer를 사용하지 않는)을 IconHighlighter를 사용하려고했으나 아이콘이 변경되지 않습니다.

treeTable.addHighlighter(new IconHighlighter(HighlightPredicate.ALWAYS, UIManager.getIcon("FileView.directoryIcon"))); 
+0

선택 배경색 속성을 'Color.RED'로 설정하면 어떨까요? 이렇게 :'treeTable.setSelectionBackground (Color.red);'. 예상대로 작동합니까? – dic19

+0

그게 실제로 작동하지만, 문제는, 내가 다른 selectionBackgrounds 노드의 의존하고 싶습니다. JTreeTable.applyRenderer (Component 구성 요소, ComponentAdapter 어댑터) –

+0

TreeCellRenderer 하위 클래스가 DefaultTreeCellRenderer 인 경우에만 BackgroundSelectionColor가 설정되기 때문에 DefaultTreeCellRenderer를 TreeCellRenderer로 설정하면 작동합니다. swingx-renderer를 사용하면 좀 더 우아한 방법이 있다고 생각했습니다. –

답변

2

[...] 문제는 내가 노드의 의존 다른 selectionBackgrounds을하려는 것이다. [...]아마 swingx-renderer를 사용하여보다 우아한 방법이라고 생각했습니다.

당신은 확실히 SwingX 렌더러 사용할 수 있습니다 (일명 : DefaultTreeRenderer를) 원하는대로 노드에 따라 배경색을 설정하기 위해 getCellRendererComponent(...) 우선합니다. 이 조각에서

IconValue iconValue = new IconValue() { 
    @Override 
    public Icon getIcon(Object value) { 
     return UIManager.getIcon("FileView.directoryIcon"); 
    } 
}; 

DefaultTreeRenderer treeCellRenderer = new DefaultTreeRenderer(iconValue) { 
    @Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
     Component c = super.getTreeCellRendererComponent(tree, value, selected, expanded, leaf, row, hasFocus); 
     if (selected && leaf) { 
      c.setBackground(Color.RED); 
     } else { 
      setBackground(tree.getBackground()); 
     } 
     return c; 
    } 
}; 

리프 (안 루트도 부모) 노드가 다음 라벨의 배경 색상이 빨간색 것을 선택하면 예를 들면 다음과 같습니다. 그렇지 않으면 레이블의 배경색이 기본값이됩니다.

+0

이것을 답으로 표시 하겠지만, 누군가 JXTreeTable.applyRenderer (java.awt.Component, org.jdesktop.swingx.decorator.ComponentAdapter)의 문제의 근원지에 도달하여 다른 해결책을 가지고있을 수도 있습니다. –