2016-08-02 30 views
1

So habe ich eine JTree, die eine variierende Anzahl von Blättern und Knoten hat, und ich muss JComboBoxes neben den Blättern des Baumes, aber keinen anderen Teil des Baumes hinzufügen.Ich habe versucht, mit der Bildschirmposition Um dies zu erreichen, müssen die Boxen und die Boxen immer enden und es wird sehr schlecht wenn ich viele Blätter habe und sie scheinen auch nur in 1 Position im Rahmen zu liegen und sich mit jeder neuen Combobox immer dünner zu machen hinzugefügt. Wie könnte ich erreichen, wonach ich suche?Jtrees und Combobox-Layout

Antwort

2

ich brauche JComboBoxes hinzufügen neben den Blättern des Baumes, aber kein anderer Teil des Baumes

Betrachten Sie Ihre eigene TreeCellRenderer zu schaffen, die eine JComboBox direkt in den JTree enthält. Um das Bearbeiten der JComboBox zu ermöglichen, müssen Sie auch eine TreeCellEditor implementieren, die die Bearbeitungskomponente und die Aktionen behandelt, die bei Abschluss der Bearbeitung an dieser Komponente auftreten. Unten ist ein sehr einfaches Beispiel, das in den Blättern eines JTree

JFrame frame = new JFrame("Test"); 
frame.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE); 
DefaultMutableTreeNode root = new DefaultMutableTreeNode("Root"); 
DefaultTreeModel model = new DefaultTreeModel(root); 
final JTree tree = new JTree(model); 

//flyweight pattern components 
//editor 
final JComboBox editorComboBox = new JComboBox(); 
final JComboBox viewComboBox = new JComboBox(); 
final Box box = Box.createHorizontalBox(); 
final JLabel myLabel = new JLabel(); 
myLabel.setBorder(BorderFactory.createEmptyBorder(2, 2, 2, 10)); 
box.add(myLabel); 
box.add(Box.createHorizontalGlue()); 
box.add(viewComboBox); 
//Custom Renderer 
DefaultTreeCellRenderer renderer = new DefaultTreeCellRenderer(){ 
    @Override 
    public Component getTreeCellRendererComponent(JTree tree, Object value, boolean sel, boolean expanded, boolean leaf, int row, boolean hasFocus) { 
     super.getTreeCellRendererComponent(tree, value, sel, expanded, leaf, row, hasFocus); 
     if (leaf){ 
      if (value instanceof MyLeafNode){ 
       MyLeafNode node = (MyLeafNode)value; 
       viewComboBox.removeAllItems(); 
       myLabel.setText(value.toString()); 
       for (String item : node.items){ 
        viewComboBox.addItem(item); 
       } 
       viewComboBox.setSelectedItem(node.selected); 
       return box; 
      } 
     } 
     return this; 
    } 
}; 

//Custom Editor 
final DefaultTreeCellEditor editor = new DefaultTreeCellEditor(tree, renderer){ 

    final ActionListener actionListener = new ActionListener(){ 
     @Override 
     public void actionPerformed(ActionEvent e) { 
      cancelCellEditing(); 
      tree.repaint(); 
     } 
    }; 

    @Override 
    public boolean isCellEditable(EventObject e){ 
     if (e.getSource() instanceof JTree){ 
      JTree tree = (JTree)e.getSource(); 
      if (tree.getLastSelectedPathComponent() == null){ 
       return false; 
      } 
      DefaultMutableTreeNode o = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); 
      return o.isLeaf(); 
     } 
     return false; 
    } 

    @Override 
    public void cancelCellEditing(){ 
     super.cancelCellEditing(); 
     DefaultMutableTreeNode node = (DefaultMutableTreeNode)tree.getLastSelectedPathComponent(); 
     if (node instanceof MyLeafNode) { 
      String sel = editorComboBox.getSelectedItem().toString(); 
      MyLeafNode mln = (MyLeafNode)node; 
      mln.selected = sel; 
      editorComboBox.removeActionListener(actionListener); 
      tree.repaint(); 
     } 
    } 

    @Override 
    public Component getTreeCellEditorComponent(JTree tree, Object value, boolean isSelected, boolean expanded, boolean leaf, int row) { 
     if (leaf){ 
      if (tree.getLastSelectedPathComponent() instanceof MyLeafNode){ 
       MyLeafNode o = (MyLeafNode)tree.getLastSelectedPathComponent(); 
       editorComboBox.removeAllItems(); 
       for (String item : o.items){ 
        editorComboBox.addItem(item); 
       } 
       editorComboBox.setSelectedItem(o.selected); 
       editorComboBox.addActionListener(actionListener); 
      } 
      return editorComboBox; 

     } 
     return super.getTreeCellEditorComponent(tree, value, isSelected, expanded, leaf, row); 
    } 

}; 
tree.setCellRenderer(renderer); 
TreePath path = new TreePath(new TreeNode[]{root}); 
tree.expandPath(path); 

for (int i = 0; i < 2; i++){ 
    DefaultMutableTreeNode p = new DefaultMutableTreeNode("P" + i); 
    model.insertNodeInto(p, root, i); 
    for (int j = 0; j < 2; j++){ 
     String[] items = {"Item 1", "Item 2", "Item 3", "Item 4"}; 
     MyLeafNode n = new MyLeafNode("N" + j, items); 
     model.insertNodeInto(n, p, j); 
    } 
    path = new TreePath(new TreeNode[]{root, p}); 
    tree.expandPath(path); 
} 
tree.setCellEditor(editor); 
tree.setEditable(true); 

JScrollPane scroller = new JScrollPane(tree); 
frame.add(scroller); 
frame.pack(); 
frame.setVisible(true); 

ein JComboBox neben einem JLabel Orte, wo MyLeafNode eine benutzerdefinierte Klasse verwendet JComboBox spezifische Daten zu speichern:

public class MyLeafNode extends DefaultMutableTreeNode{ 

    private String[] items; 
    private String selected; 

    public MyLeafNode(String name, String...items){ 
     super(name); 
     this.items = items; 
     this.selected = items[0]; 
    } 

}