Problem mit JTree-Darstellung

Status
Nicht offen für weitere Antworten.

mschill

Mitglied
Hallo
Mein JTree möchte sich einfach nicht korrekt anzeigen lassen. Momentan sieht das so aus:

[ ] [Cyberware, Bioware]
|
| <----- Hier ist einfach eine Zeile leer, wenn man draufklickt ändert sich untere Zeile zu Cyberware
|
+-- Bioware

Den Code dazu ist hier:

Panel mit JTree:

Code:
public class SRImplantListPanel extends JPanel {

    private JButton addButton;

    private JButton upButton;

    private JButton downButton;

    private JPanel implantEditPanel;

    private JTree tree;

    private SRImplantsTreeModel treeModel;

    private JFrame parent;

    private SRImplantsList implants;

    /**
     *  
     */
    public SRImplantListPanel(JFrame parent, SRImplantsList implants) {
        super(new BorderLayout());
        this.parent = parent;
        this.implants = implants;
        this.setName(I18N.getString(I18N.getPanelsResourceBundle(),
                "implantsListPanel"));
        initComponents();
        addComponents();
        addListeners();
    }

    private void initComponents() {
        addButton = I18N.createJButton("add");
        upButton = new JButton();
        upButton.setIcon(IconLoader
                .loadIcon("toolbarButtonGraphics/navigation/Up16.gif"));
        downButton = new JButton();
        downButton.setIcon(IconLoader
                .loadIcon("toolbarButtonGraphics/navigation/Down16.gif"));

        treeModel = new SRImplantsTreeModel(implants);
        tree = new JTree();
        tree.setModel(treeModel);
        tree.setRootVisible(true);
        implantEditPanel = new JPanel(new GridLayout(1, 1));
    }

    private void addComponents() {
        JSplitPane splitPane = new JSplitPane(JSplitPane.HORIZONTAL_SPLIT,
                new JScrollPane(tree), new JScrollPane(implantEditPanel));
        this.add(splitPane);
        JPanel buttonPanel = new JPanel(new FlowLayout());
        buttonPanel.add(addButton);
        this.add(buttonPanel, BorderLayout.SOUTH);
        JPanel navigationPanel = new JPanel(new FlowLayout(FlowLayout.CENTER));
        Box box = new Box(BoxLayout.Y_AXIS);
        box.add(Box.createVerticalGlue());
        box.add(upButton);
        box.add(downButton);
        box.add(Box.createVerticalGlue());
        navigationPanel.add(box);
        this.add(box, BorderLayout.WEST);
    }

    private void addListeners() {
        addButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                addItem();
            }
        });
        upButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                setItemPosition(-1);
            }
        });
        downButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent e) {
                setItemPosition(+1);
            }
        });
        tree.addTreeSelectionListener(new TreeSelectionListener() {

            public void valueChanged(TreeSelectionEvent e) {
                Object node = tree.getLastSelectedPathComponent();
                if (node == null || node instanceof SRImplantsList) return;
                if (tree.getSelectionPath().getPathCount()>1){
	                Object parent = tree.getSelectionPath().getPathComponent(tree.getSelectionPath().getPathCount() - 2);
	                editItem(node, parent);
                }
            }
        });
    }

    private void setItemPosition(int position) {
		treeModel.move(tree.getSelectionPath(), position);
    }

    private void editItem(Object item, Object parent) {
        if (item instanceof SRImplant) {
            implantEditPanel.removeAll();
            SRImplantEditPanel panel;
            if (parent instanceof SRImplantGroup) {
                panel = new SRImplantEditPanel((SRImplant) item,
                        (SRImplantGroup) parent);
            } else if (parent instanceof SRImplant) {
                panel = new SRImplantEditPanel((SRImplant) item,
                        ((SRImplant) parent).getContainedImplants());
            } else {
                return;
            }

            implantEditPanel.add(panel);
            implantEditPanel.validate();
            addImplantEditPanelListeners(panel);
        } else if (item instanceof SRImplantGroup) {
            implantEditPanel.removeAll();
            implantEditPanel.validate();
            implantEditPanel.repaint();
        }
    }

    private void addImplantEditPanelListeners(SRImplantEditPanel panel) {
        panel.removeButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {
                Object node = tree.getLastSelectedPathComponent();
                Object parent = tree.getSelectionPath().getPathComponent(
                        tree.getSelectionPath().getPathCount() - 2);

                if (parent instanceof SRImplant) {
                    ((SRImplant) parent).getContainedImplants().remove(node);
                } else if (parent instanceof SRImplantGroup) {
                    ((SRImplantGroup) parent).remove(node);
                }

                implantEditPanel.removeAll();
                implantEditPanel.validate();
                implantEditPanel.repaint();
            }
        });
        panel.saveButton.addActionListener(new ActionListener() {

            public void actionPerformed(ActionEvent arg0) {

            }
        });
    }

    private void addItem() {
        Object parent = tree.getLastSelectedPathComponent();

        SRImplant implant = treeModel.addImplant(tree.getSelectionPath());
        editItem(implant, parent);
    }
}


Der Code für das TreeModel:

Code:
public class SRImplantsTreeModel implements TreeModel {

    private Vector treeModelListeners = new Vector();

    private SRImplantsList implants;

    public SRImplantsTreeModel(SRImplantsList implants) {
        this.implants = implants;
    }

    //////////////// Fire events //////////////////////////////////////////////

    /**
     * The event is TreeStructureChanged with the root as path, i.e. the whole
     * tree has changed.
     */
    protected void fireTreeStructureChanged(SRImplantsList implants) {
        int len = treeModelListeners.size();
        TreeModelEvent e = new TreeModelEvent(this,
                new Object[] { this.implants});

        for (int i = 0; i < len; i++) {
            ((TreeModelListener) treeModelListeners.elementAt(i))
                    .treeStructureChanged(e);
        }
        this.implants = implants;
    }

    protected void fireTreeStructureChanged(TreePath path) {
        int len = treeModelListeners.size();
        TreeModelEvent e = new TreeModelEvent(this, path);

        for (int i = 0; i < len; i++) {
            ((TreeModelListener) treeModelListeners.elementAt(i))
                    .treeStructureChanged(e);
        }
    }

    //////////////// TreeModel interface implementation ///////////////////////

    /**
     * Adds a listener for the TreeModelEvent posted after the tree changes.
     */
    public void addTreeModelListener(TreeModelListener l) {
        treeModelListeners.addElement(l);
    }

    /**
     * Returns the child of parent at index index in the parent's child array.
     */
    public Object getChild(Object parent, int index) {
        Object object = "Error";
        
        if (parent instanceof SRImplantTreeObject) {
            object = ((SRImplantTreeObject) parent).get(index);
        } else if (parent instanceof SRImplantsList) {
            object = ((SRImplantsList) parent).get(index);
        }
        
        return object;
    }

    /**
     * Returns the number of children of parent.
     */
    public int getChildCount(Object parent) {
        if (parent instanceof SRImplantTreeObject) {
            return ((SRImplantTreeObject) parent).getSize();
        } else {
            return ((SRImplantsList) parent).size() ;
        }
    }

    /**
     * Returns the index of child in parent.
     */
    public int getIndexOfChild(Object parent, Object child) {
        if (parent instanceof SRImplantTreeObject) {
            return -1; //((SRImplantTreeObject) parent).indexOf(child);
        } else {
            return ((SRImplantsList) parent).indexOf(child);
        }
    }

    /**
     * Returns the root of the tree.
     */
    public Object getRoot() {
        return implants;
    }

    /**
     * Returns true if node is a leaf.
     */
    public boolean isLeaf(Object node) {
        if (node instanceof SRImplantTreeObject) {
            return (((SRImplantTreeObject) node).getSize() == 0);
        } else {
            return false;
        }
    }

    /**
     * Removes a listener previously added with addTreeModelListener().
     */
    public void removeTreeModelListener(TreeModelListener l) {
        treeModelListeners.removeElement(l);
    }

    /**
     * Messaged when the user has altered the value for the item identified by
     * path to newValue. Not used by this model.
     */
    public void valueForPathChanged(TreePath path, Object newValue) {
        System.out.println("*** valueForPathChanged : " + path + " --> "
                + newValue);

        if (newValue instanceof String) System.out.println("Yeah!!");
    }

    /**
     * @author schill
     */
    public SRImplant addImplant(TreePath path) {
        SRImplant implant = ((SRImplantTreeObject) path.getLastPathComponent())
                .addNewImplant();
        this.fireTreeStructureChanged(implants);
        return implant;
    }

    /**
     * @author schill
     */
    public void move(TreePath path, int position) {
        ((SRImplantTreeObject) path.getPathComponent(path.getPathCount() - 2))
                .move((SRImplantTreeObject) path.getLastPathComponent(),
                        position);
        this.fireTreeStructureChanged(path);
    }
}

Es werden garantiert keine Null-Objekte an den Tree geliefert. Was habe ich falsch gemacht?

Vielen Dank im Voraus
 
B

Beni

Gast
Geben die Einträge die verschwinden "true" zurück, falls man die Methode "equals" mit einem anderen (ähnlichen) Eintrag aufruft?

Ich hatte nämlich auch mal so einen Bug, und konnte ihn lösen, indem ich um das eigentliche Objekt (ein String), welches eingetragen wurde eine "Kapsel" machte, so dass "equals" immer false (bzw. die Operation "==" verwendete) zurückgab.
 

mschill

Mitglied
Ich habe unterdessen endlich einmal das PRoblem eingrenzen können: Immer wenn man ein Objekt, dessen Klasse von Vektor erbt als node nimmt, dann kommt es zu diesem Fehler.

Jetzt ist meine Frage: Wieso? Und wie kann man das ändern?
 
B

bygones

Gast
<offtopic>Uhi - wenn das mal nicht nach Shadowrun riecht :wink: </offtopic>
 

mschill

Mitglied
@Beni: Danke :) Daran lags:

Vektor überschreibt die Methode equals so, dass der Inhalt kontrolliert wird. Da dieser bei beiden gleich ist (nämlich leer) gabs diesen Fehler.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Swing JTree Problem beim erstellen der Knoten AWT, Swing, JavaFX & SWT 0
RELAXccc Swing JTree + JScrollPane, refresh Problem AWT, Swing, JavaFX & SWT 17
R Swing XML Datei in JTree, Problem mit Daten einlesen AWT, Swing, JavaFX & SWT 34
B Swing JTree traverse Problem AWT, Swing, JavaFX & SWT 2
T Dynamic JTree: File System Problem AWT, Swing, JavaFX & SWT 2
G JTree Problem: Null Child not allowed AWT, Swing, JavaFX & SWT 12
H JTree Nullpointer Problem AWT, Swing, JavaFX & SWT 4
S JTree Design Problem AWT, Swing, JavaFX & SWT 5
G Problem mit JTree AWT, Swing, JavaFX & SWT 7
Lazybone JTree refresh Problem AWT, Swing, JavaFX & SWT 3
I JTree und JCheckbox Problem AWT, Swing, JavaFX & SWT 4
S JTree Problem AWT, Swing, JavaFX & SWT 8
L Problem mit der aktualisierung von JTree und Text Area AWT, Swing, JavaFX & SWT 22
G JTree mit Checkboxen und Problem mit isSelected() AWT, Swing, JavaFX & SWT 2
S Problem mit JTree AWT, Swing, JavaFX & SWT 3
D Layout Problem / JTree und JPanel AWT, Swing, JavaFX & SWT 4
S ClassCast-Problem im JTree AWT, Swing, JavaFX & SWT 2
S JTree / problem / graphikfehler AWT, Swing, JavaFX & SWT 4
Z immer Problem mit Eingabe durch JTextField und JTree AWT, Swing, JavaFX & SWT 7
EagleEye JTree Node löschen Problem AWT, Swing, JavaFX & SWT 4
P Problem mit JTree AWT, Swing, JavaFX & SWT 10
J JTree (TreeSelectionListener) Problem AWT, Swing, JavaFX & SWT 2
A JTree Problem mit Focus bzw. Selection AWT, Swing, JavaFX & SWT 5
G Jtree problem AWT, Swing, JavaFX & SWT 4
V JTree Children Ausgabe Problem AWT, Swing, JavaFX & SWT 2
G Problem mit der Anzeige von jLabel. Unlesbar wenn der Text geändert wird. AWT, Swing, JavaFX & SWT 28
H 2D-Grafik Problem mit Paint AWT, Swing, JavaFX & SWT 1
S Layout - Problem AWT, Swing, JavaFX & SWT 1
Tassos JavaFX/Problem mit der Maussteuerung in Stackpane AWT, Swing, JavaFX & SWT 7
sserio Java Fx - Problem AWT, Swing, JavaFX & SWT 3
A Problem Spiel auf Panel der GUI zu bringen AWT, Swing, JavaFX & SWT 1
A JavaFX Controller Problem AWT, Swing, JavaFX & SWT 1
TheWhiteShadow JavaFX ListView Problem beim Entfernen von Elementen AWT, Swing, JavaFX & SWT 1
E LayoutManager Welcher Layout-Mix löst mein Problem? AWT, Swing, JavaFX & SWT 3
Umb3rus JavaFX Problem mit PropertyValueFactory: can not read from unreadable property AWT, Swing, JavaFX & SWT 1
T Problem mit paintComponent() AWT, Swing, JavaFX & SWT 17
AmsananKING Java Menü-Problem AWT, Swing, JavaFX & SWT 1
K JavaFX Resizing-Problem beim BorderLayout (Center Component) beim Arbeiten mit mehreren FXMLs AWT, Swing, JavaFX & SWT 2
G Instance OF Problem AWT, Swing, JavaFX & SWT 9
FrittenFritze Ein Problem mit der CSSBox, die Größe wird nicht angepasst AWT, Swing, JavaFX & SWT 5
M Problem mit dem Anzeigen von Frames im Vordergrund AWT, Swing, JavaFX & SWT 5
Badebay Problem mit JButton AWT, Swing, JavaFX & SWT 2
newJavaGeek Grid-Layout problem AWT, Swing, JavaFX & SWT 7
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
JavaTalksToMe JavaFx ExekutorService Problem AWT, Swing, JavaFX & SWT 2
Zrebna Problem bei Eventhandling (Value soll nach jedem erneutem Klick gelöscht werden) AWT, Swing, JavaFX & SWT 4
B Problem mit JavaFX AWT, Swing, JavaFX & SWT 5
J css Problem AWT, Swing, JavaFX & SWT 5
B JavaFX habe mein Problem fett markiert AWT, Swing, JavaFX & SWT 2
A Swing Filter-Problem AWT, Swing, JavaFX & SWT 1
temi JavaFX Problem mit IntelliJ und JavaFx 11 unter XUbuntu AWT, Swing, JavaFX & SWT 3
L Java FX Problem mit Ubuntu 18 und JavaFx AWT, Swing, JavaFX & SWT 27
H JTable TableCellEditor-Problem AWT, Swing, JavaFX & SWT 0
kodela Swing Problem mit Warten-Dialog AWT, Swing, JavaFX & SWT 16
B JavaFx Scene Builder Problem AWT, Swing, JavaFX & SWT 2
B [Problem] Java öffnet Word-Datein nicht AWT, Swing, JavaFX & SWT 14
T DataBinding Problem AWT, Swing, JavaFX & SWT 5
Blender3D Problem mit € Symbol Font Gotham Windows 10 Swing AWT, Swing, JavaFX & SWT 11
T Problem mit JTable Sortierung AWT, Swing, JavaFX & SWT 2
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 15
J Problem mit Platfrom run later AWT, Swing, JavaFX & SWT 0
D Swing SwingUtils / Thread Problem AWT, Swing, JavaFX & SWT 3
L JavaFX Problem beim Aufrufen einer Methode AWT, Swing, JavaFX & SWT 5
T Swing Problem mit Datum und FormattedTextField AWT, Swing, JavaFX & SWT 2
S AWT Java print dialog Problem AWT, Swing, JavaFX & SWT 0
olfibits JavaFX Problem mit HTMLEditor AWT, Swing, JavaFX & SWT 0
W SWT hover-background-problem with first column in TreeViewer AWT, Swing, JavaFX & SWT 0
M Problem mit Add JScrollPane AWT, Swing, JavaFX & SWT 25
Mario1409 Swing JTextArea scroll Problem AWT, Swing, JavaFX & SWT 0
N Swing Problem mit loop AWT, Swing, JavaFX & SWT 2
S Swing Problem mit Button und ActionListener AWT, Swing, JavaFX & SWT 5
S Swing & Clean und build Problem AWT, Swing, JavaFX & SWT 12
S JLabel setText() Problem AWT, Swing, JavaFX & SWT 6
I 2D-Grafik Problem beim Ändern der Farbe eine 2d Objekts AWT, Swing, JavaFX & SWT 3
G Swing Splitpane Problem AWT, Swing, JavaFX & SWT 1
F Problem mit der FXML Rectangle Shape AWT, Swing, JavaFX & SWT 2
N JavaFX Stranges Problem mit der Autoscroll-Eigenschaft von Textareas AWT, Swing, JavaFX & SWT 0
E Java FX FXML Problem mit html Scriptausführung AWT, Swing, JavaFX & SWT 2
J JavaFX Intersect Problem mit Shapes AWT, Swing, JavaFX & SWT 10
R JavaFX MediaPlayer AVI-Problem AWT, Swing, JavaFX & SWT 1
M Swing Problem mit ListCellRenderer AWT, Swing, JavaFX & SWT 7
D Problem mit JTable AWT, Swing, JavaFX & SWT 1
F GUI Auflösung ändern - Koordianten und Proportions Problem AWT, Swing, JavaFX & SWT 21
J Problem mit Button darstellung AWT, Swing, JavaFX & SWT 23
M Problem mit Layoutmanagern... Hilfe wäre sehr nett. AWT, Swing, JavaFX & SWT 2
S 2D-Grafik Problem mit Variablen AWT, Swing, JavaFX & SWT 4
7 JavaFX Problem beim Zeichnen eines Dreiecks in einem GUI AWT, Swing, JavaFX & SWT 6
M Swing AttributiveCellTableModel addRow() Problem AWT, Swing, JavaFX & SWT 1
J Swing Problem mit Graphics Methode AWT, Swing, JavaFX & SWT 4
N JavaFX Problem mit table multiple selection AWT, Swing, JavaFX & SWT 5
K CheckBox Problem AWT, Swing, JavaFX & SWT 5
Grevak DisplayMode Problem seit Windows 10 AWT, Swing, JavaFX & SWT 2
S Swing Eigene JComboBox Problem! AWT, Swing, JavaFX & SWT 1
B Swing Problem mit Bildpfad AWT, Swing, JavaFX & SWT 4
N Swing Problem beim Scrollen mit JScrollPane AWT, Swing, JavaFX & SWT 6
V Graphics g - drawOval problem mit background AWT, Swing, JavaFX & SWT 1
C AWT Problem mit Protokol Fenster AWT, Swing, JavaFX & SWT 0
M Swing pack() Problem mit Taskleiste AWT, Swing, JavaFX & SWT 4
N Swing Choice- Problem! AWT, Swing, JavaFX & SWT 8
Q "AWT-EventQueue-0" Exception Problem AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen

Neue Themen


Oben