Weiße Lücke nach expandieren eines Pfades im JTree?

  • Themenstarter Themenstarter Felli
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
F

Felli

Gast
Hallo,

nachdem ein neuer Knoten in mein JTree eingefügt wurde, möchte ich diesen sichtabr machen. Dazu verwende ich den TreeModelListener:

Code:
        public void treeNodesInserted(TreeModelEvent e)
        {
            TreePath path = e.getTreePath();

            if (isCollapsed(path) && path.getLastPathComponent() instanceof DefaultMutableTreeNode &&
                ((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject() instanceof Geraet)
            {
                 expandPath(path);
            }
        }

Das ganze funkioniert soweit, nur wird der eingefügte Knoten mit einem größeren Abstand zur nächsten Zeile dargestellt, was ich mit überhaupt nicht erklären kann ([img=http://img185.imageshack.us/img185/5830/jtreelueckeyz5.th.png]). Wird der Pfad manuell vom Benutzer expandiert, so stellt er den Knoten normal dar. Kennt jemand diesen Effekt? Gibt's eine Möglichkeit, dies zu verhindern?
 
Vor langer, langer Zeit hatte ich mal einen ähnlichen Effekt, weiss aber jetzt nicht mehr, woran es lag.
Könntest du bitte ein kurzes, selbständiges, kompilierbares Beispiel machen?
 
Hallo,

hier habe ich ein kurzes und schnell zusammengeschustertes Beispiel, bei dem derselbe Effekt auftritt:

Code:
import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.tree.*;
import javax.swing.event.*;

public class Test    
extends JFrame
{       
    JButton b = new JButton("Einfügen");
    TestTreeModel testTreeModel = new TestTreeModel();
    JTree tree = new MeinBaum(testTreeModel);
    
    public Test()
    {
        this.setSize(400,300);
        this.getContentPane().setLayout(new BorderLayout());
        this.getContentPane().add(new JScrollPane(tree), BorderLayout.CENTER);
        this.getContentPane().add(b, BorderLayout.SOUTH);
        this.setLocationRelativeTo(null);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        b.addActionListener(new ActionListener(){
            public void actionPerformed(ActionEvent e)
            {
                testTreeModel.insert("Neues Gerät");
            }
        });
    } 

    public static void main(String... argv)
    throws Exception
    {
       new Test().setVisible(true);    
    }
    
    /////////////////////////////////////
    // Klasse: MeinBaum
    /////////////////////////////////////
    static class MeinBaum
    extends JTree
    implements TreeModelListener
    {
        public MeinBaum(TreeModel newModel)
        {
            super(newModel);
            this.getModel().addTreeModelListener(this);
        }
        
        public void treeNodesChanged(TreeModelEvent e)
        {}

        public void treeNodesInserted(TreeModelEvent e)
        {
            TreePath path = e.getTreePath();
            TreePath parentPath = path.getParentPath();
            Object lastComp = path.getLastPathComponent();
            
            if (isCollapsed(path) && path.getLastPathComponent() instanceof DefaultMutableTreeNode &&
               ((DefaultMutableTreeNode)path.getLastPathComponent()).getUserObject() instanceof String)
            {
                expandPath(path);
            }
        }

        public void treeNodesRemoved(TreeModelEvent e)
        { }

        public void treeStructureChanged(TreeModelEvent e)
        { }
    }
    
    /////////////////////////////////////
    // Klasse: TestTreeModel
    /////////////////////////////////////
    static class TestTreeModel
    extends DefaultTreeModel
    {
        DefaultMutableTreeNode wurzel;
        DefaultMutableTreeNode geraet1;
        DefaultMutableTreeNode geraet2;
        
        public TestTreeModel()
        {
            super(new DefaultMutableTreeNode("Auftrag"));
            wurzel = (DefaultMutableTreeNode)getRoot();
            
            DefaultMutableTreeNode miob1 = new DefaultMutableTreeNode("Mietobjekt 1");
            geraet1 = new DefaultMutableTreeNode("Geraet 1");
            geraet2 = new DefaultMutableTreeNode("Geraet 1");
            miob1.add(geraet1);
            miob1.add(geraet2);
            wurzel.add(miob1);
        }
        
        public void insert(String geraetName)
        {
            insertNodeInto(new DefaultMutableTreeNode(geraetName), geraet1, geraet1.getChildCount());
        }
    }
}
 
"expandPath" scheint da irgendwie dreinzufunken.
Vielleicht sollten wir den später aufrufen. Versuch's mal so:
Code:
public void treeNodesInserted(TreeModelEvent e) {
    final TreePath path = e.getTreePath();
    if (isCollapsed(path) && path.getLastPathComponent() instanceof DefaultMutableTreeNode &&
            ((DefaultMutableTreeNode) path.getLastPathComponent()).getUserObject() instanceof String) {
        SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                expandPath(path);
            }
        });

    }
}
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben