JTree-Elemente immer als Knoten darstellen?

Wie kann ich es beeinflussen das ein Knoten in einem Tree so dargestellt wird (mit +/-) wie als wenn er Childs hätte, auch wenn er in Wirklichkeit keine hat?

Im TreeModel “isLeaf” überschreiben, und true zurückgeben. Oder wenn du “TreeNode” verwendest, sollte es IMHO reichen, bei “getAllowsChildren” true zurückzugeben.

isLeaf hab ich schon gehabt dadurch konnte ich es immer auf und zu klappen egal ob etwas da war
getAllowsChildren hatte ich nicht drin aber das hat keinen Einfluss

Jaja … der gute JTree :wink: . Ich kann morgen mal ne Freundin fragen, die hat das imho schonmal gemacht (sofern ichs nicht vergess oder es bis dahin nicht gelöst wurde :stuck_out_tongue_winking_eye: )

das wäre nett :slight_smile:

Also mit nem DefaultTreeModel musst du setAsksAllowsChildren(true) aufrufen, und in der TreeNodes getAllowsChildren immer true zurückgeben lassen.
Das sollte (muss) sich auch in einem normalen TreeModel implementieren lassen, wenn die Vorschläge oben nicht funktionieren, bin ich aber überfragt, wie.

ne das klappt leider auch nicht
hier mal so ein Treenode

/*
 * Created on 31.03.2007
 * 
 * Copyright (c) 2007, Kay Czarnotta
 * 
 * All rights reserved.
 */
package de.eagleside.databasedesigner.gui.designer.modeltree;

/**
 * @author Eagle Eye
 * 
 */
public class ColumnRootTreeNode extends ModelTreeNode
{
  public String getName()
  {
    return "Spalten";
  }

  public boolean isLeaf()
  {
    return false;
  }

  /**
   * @see javax.swing.tree.DefaultMutableTreeNode#getAllowsChildren()
   */
  public boolean getAllowsChildren()
  {
    return true;
  }

  public void add(ColumnTreeNode node)
  {
    for(int i = 0; i < getChildCount(); i++)
      if(node.getName().compareToIgnoreCase(((ColumnTreeNode)getChildAt(i)).getName()) < 0)
      {
        insert(node, i);
        break;
      }
  }
}

und hier mein Model

  public DatabaseModelTree()
  {
    setLayout(new GridLayout(1, 1));
    add(new JScrollPane(tree = new JTree(model = new DefaultTreeModel(root))));

    tree.addTreeExpansionListener(new ExpansionListener());
    tree.setCellRenderer(new ModelTreeRenderer());
    tree.setRootVisible(false);
    tree.expandRow(0);
    model.setAsksAllowsChildren(true);
  }

Hm, besagte Freundin weiß zwar, dass es geht, aber nicht mehr wie (Altersdemenz!?). Wenn es ihr wieder einfällt, teilt sie es mir mit :stuck_out_tongue:

danke das wäre schön, es geht zwar so wie es ist nur würde es dann schöner aussehen :slight_smile:

Ganz ehrlich, ich rechne nicht damit noch ne Antwort von ihr zu bekommen … :frowning:

joa Frauen halt (hat doch hoffentlich niemand gelesen)
Ne ist erstmal nicht so schlimm ich hab genug anderes zu tun, wenn ich eine Lösung hab werd ich sie hier schreiben. Solange bin ich auch immer offen für neue Ideen :wink:

[QUOTE=EagleEye]Wie kann ich es beeinflussen das ein Knoten in einem Tree so dargestellt wird (mit +/-) wie als wenn er Childs hätte,
auch wenn er in Wirklichkeit keine hat?[/QUOTE]

Eine Möglichkeit: “BasicTreeUI” erweitern,
dann “paintExpandControl” und “shouldPaintExpandControl” überschreiben:

/*
 * TreeDemo.java
 */
import java.awt.*;
import javax.swing.*;
import javax.swing.plaf.basic.*;
import javax.swing.tree.*;
public class TreeDemo extends JFrame {
    private JTree tree;
    public TreeDemo() {
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
        tree = new JTree();
        getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
        pack();
        tree.setUI(new TreeUI());
    }
    public static void main(final String args[]) {new TreeDemo().setVisible(true);}
    class TreeUI extends BasicTreeUI{
        protected void paintExpandControl(Graphics g, Rectangle clipBounds, 
                Insets insets, Rectangle bounds, TreePath path, int row, 
                boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) {
            Object value = path.getLastPathComponent();
            int middleXOfKnob;
            middleXOfKnob = bounds.x - (getRightChildIndent() - 1);
            int middleYOfKnob = bounds.y + (bounds.height / 2);
            if (isExpanded) {
                Icon expandedIcon = getExpandedIcon();
                if(expandedIcon != null)
                    drawCentered(tree, g, expandedIcon, middleXOfKnob,
                            middleYOfKnob );
            } else if(!isExpanded || isLeaf){//<-----------------------------------------
                Icon collapsedIcon = getCollapsedIcon();
                if(collapsedIcon != null)
                    drawCentered(tree, g, collapsedIcon, middleXOfKnob,
                            middleYOfKnob);
            }
        }
        protected boolean shouldPaintExpandControl(TreePath path, int row,
                boolean isExpanded, boolean hasBeenExpanded, boolean isLeaf) {
            return true;//<----------------------------------------------------
        }
    }
}```

stimmt das ist eine Idee Andre an die hab ich noch garnicht gedacht
wenn ich wieder Zeit zum programmieren hab werd ich das mal probieren