2011-07-25 53 views
3

是否有可能在兩個兄弟節點之間有不同顏色的樹形線?JTree與不同顏色的樹線?

我想表明這兩個節點通過藍線連接起來。但是整個JTree默認顏色是灰色或黑色的斜線。某些節點之間可能有部分不同的彩色線條?

回答

2

可以是

import java.awt.BorderLayout; 
import java.awt.Color; 
import java.awt.Component; 
import java.util.Vector; 

import javax.swing.BorderFactory; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JScrollPane; 
import javax.swing.JTree; 
import javax.swing.tree.DefaultMutableTreeNode; 
import javax.swing.tree.DefaultTreeCellRenderer; 
import javax.swing.tree.TreeCellRenderer; 

class TreeNodeVectorA<E> extends Vector<E> { 

    private static final long serialVersionUID = 1L; 
    private String name; 

    TreeNodeVectorA(String name) { 
     this.name = name; 
    } 

    TreeNodeVectorA(String name, E elements[]) { 
     this.name = name; 
     for (int i = 0, n = elements.length; i < n; i++) { 
      add(elements[i]); 
     } 
    } 

    @Override 
    public String toString() { 
     return "[" + name + "]"; 
    } 
} 

class Employee { 

    public String firstName; 
    public String lastName; 
    public float salary; 

    Employee(String f, String l, float s) { 
     this.firstName = f; 
     this.lastName = l; 
     this.salary = s; 
    } 
} 

class EmployeeCellRenderer implements TreeCellRenderer { 

    private JLabel firstNameLabel = new JLabel(" "); 
    private JLabel lastNameLabel = new JLabel(" "); 
    private JLabel salaryLabel = new JLabel(" "); 
    private JPanel renderer = new JPanel(); 
    private DefaultTreeCellRenderer defaultRenderer = new DefaultTreeCellRenderer(); 
    private Color backgroundSelectionColor; 
    private Color backgroundNonSelectionColor; 

    EmployeeCellRenderer() { 
     firstNameLabel.setForeground(Color.BLUE); 
     renderer.add(firstNameLabel); 
     lastNameLabel.setForeground(Color.BLUE); 
     renderer.add(lastNameLabel); 
     salaryLabel.setHorizontalAlignment(JLabel.RIGHT); 
     salaryLabel.setForeground(Color.RED); 
     renderer.add(salaryLabel); 
     renderer.setBorder(BorderFactory.createLineBorder(Color.BLACK)); 
     backgroundSelectionColor = defaultRenderer.getBackgroundSelectionColor(); 
     backgroundNonSelectionColor = defaultRenderer.getBackgroundNonSelectionColor(); 
    } 

    @Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean selected, 
      boolean expanded, boolean leaf, int row, boolean hasFocus) { 
     Component returnValue = null; 
     if ((value != null) && (value instanceof DefaultMutableTreeNode)) { 
      Object userObject = ((DefaultMutableTreeNode) value).getUserObject(); 
      if (userObject instanceof Employee) { 
       Employee e = (Employee) userObject; 
       firstNameLabel.setText(e.firstName); 
       lastNameLabel.setText(e.lastName); 
       salaryLabel.setText("" + e.salary); 
       if (selected) { 
        renderer.setBackground(backgroundSelectionColor); 
       } else { 
        renderer.setBackground(backgroundNonSelectionColor); 
       } 
       renderer.setEnabled(tree.isEnabled()); 
       returnValue = renderer; 
      } 
     } 
     if (returnValue == null) { 
      returnValue = defaultRenderer.getTreeCellRendererComponent(tree, value, selected, expanded, 
        leaf, row, hasFocus); 
     } 
     return returnValue; 
    } 
} 

public class EmployeeTree { 

    public static void main(String args[]) { 
     JFrame frame = new JFrame("Book Tree"); 
     frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     Employee javaBooks[] = {new Employee("A", "F", 9.99f), new Employee("B", "E", 4.99f), 
      new Employee("C", "D", 9.95f)}; 
     Employee netBooks[] = {new Employee("AA", "CC", 9.99f), new Employee("BB", "DD", 9.99f)}; 
     Vector<Employee> javaVector = new TreeNodeVectorA<Employee>("A", javaBooks); 
     Vector<Employee> netVector = new TreeNodeVectorA<Employee>("As", netBooks); 
     Object rootNodes[] = {javaVector, netVector}; 
     Vector<Object> rootVector = new TreeNodeVectorA<Object>("Root", rootNodes); 
     JTree tree = new JTree(rootVector); 
     TreeCellRenderer renderer = new EmployeeCellRenderer(); 
     tree.setCellRenderer(renderer); 
     JScrollPane scrollPane = new JScrollPane(tree); 
     frame.add(scrollPane, BorderLayout.CENTER); 
     frame.setSize(300, 300); 
     frame.setVisible(true); 
    } 

    private EmployeeTree() { 
    } 
}