Tree - ArrayList Zuordnung!

Status
Nicht offen für weitere Antworten.

sunnyfriday

Aktives Mitglied
Hallo Leute,


Habe ein kleines Problem. Und zwar habe ich eine ArrayList von Objekten.
Ich möchte diese ArrayList in einem Tree darstellen.


Jedoch möchte ich eine Zuordnung der Tree-Nodes zu den Arraylist-Objekte haben.
Zb. Wenn ich im Tree den Node x lösche, dann sollte das entsprechende Objekt im arrayList auch gelöscht werden.
oder wenn ich im tree einen neu neues Node hinzufüge, dann soll auch ein Objekt im entsprechenden Arraylist angelegt werden.

Wie bekomme ich diese Zuordnung Tree - ArrayList hin??

Beispiel:

Code:
class Kunde {

 private String name;
 private String vorname;

}

Code:
.
.
ArrayList<Kunde> kundenList = new ArrayList<Kunde>();
.
.


Kunden
|
- kunde1
- kunde2
- kunde3
- kunde4

hoffe jemand kann helfen...

Danke
 

Marco13

Top Contributor
Man kann ein TreeModel erstellen, das intern diese ArrayList kennt (oder verwendet). Allerdings wird dieses automatische Aktualisieren dann erstmal nur in der Richtung TreeModel->ArrayList funktionieren, und nicht umgekehrt.
 

sunnyfriday

Aktives Mitglied
Hallo Marco,

Danke für den Tipp mit dem TreeModel.



Würde es funktionieren, wenn ich eine Klasse habe, die TreeModel implementiert und eine Arraylist verwaltet.

So das ich in der ArrayList von außen elemente hinzufügen,entfernen,verschieben kann und automatisch der Baum aktualisert wird.??

Oder wenn ich im tree einen Node entferne, daß ich in der Arraylist das entsprechende Element entferne??

Würde das mit einem TreeModel funktionieren???

gruß
 

Marco13

Top Contributor
Würde es funktionieren, wenn ich eine Klasse habe, die TreeModel implementiert und eine Arraylist verwaltet.

Wie gesagt: ""Ja""

So das ich in der ArrayList von außen elemente hinzufügen,entfernen,verschieben kann und automatisch der Baum aktualisert wird.??

Wie gesagt: Nein

Oder wenn ich im tree einen Node entferne, daß ich in der Arraylist das entsprechende Element entferne??

Wie gesagt: Ja

Würde das mit einem TreeModel funktionieren???

Wie gesagt: Jein.


Wenn sich in dem TreeModel irgendwas ändert, dann kann man (weil man das TreeModel ja SELBST geschrieben hat) dafür sorgen, dass alle änderungen auch in die ArrayList übertragen werden.

Umgekehrt geht das (erstmal) NICHT: Wenn man an der ArrayList irgendwas ändert, dann kriegt davon niemand etwas mit.

Ich weiß nicht, in welchen Zusammenhang du das brauchst, was du genau erreichen willst, usw. aber evtl. wäre es sinnvoll, dir eine eigene Klasse "KundenDaten" zu schreiben, die deine Kunden speichert, und alle gewünschten Operationen anbietet. Alle diese Operationen könnten "KundenEvents" an "KundenListener" senden, und es könnte Implementierungen für "KundenListener" geben, die die ArrayList und ein TreeModel aktualisieren. Aber das sind Designentscheidungen, die DU treffen musst.
 
M

Michael...

Gast
Anstatt TreeModel zu implementieren, würde ich von DefaultTreeModel (welches TreeModel implementiert) erben und darin die ArrayList verwalten.
 

sunnyfriday

Aktives Mitglied
Hallo,

es scheint echt kompliziert zu sein.

Was ich konkret brauche ist:

ich habe eine ArrayList<Kunde> kundenlist.

1. die kundenliste als tree ausgeben.
2. aus dem tree heraus. kunden löschen, einfügen, reihenfolge ändern. => das ganze dann auch auf die kundenlist übertragen.

3. die modifizierte KundenList dann weitergeben an andere Funktion.


Ich werde mich mal damit auseinandersetzen... danke nochmals
 

sunnyfriday

Aktives Mitglied
Hallo,

Soll ich jetzt die Schnittstelle TreeModel implementieren oder von der Klasse DefaultTreeModel erben??

Bei DefaultTreeModel gibt es Funktionen die in meinem Fall zu gebrauchen sind.

wie z.b. insertNodeInto()...

Wenn ich mich für die DefaultTreeModel klasse entscheide, muss ich dann die ganzen Methoden überschreiben???

Ich weis jetzt nicht welche Variante ich nehmen soll. Weis jemand Rat??

Gruss
 
M

Michael...

Gast
Der Vorteil wenn man DefaultTreeModel verwendet ist, dass man nur die Methoden überschreiben muss, die man will. D.h. die Methoden, welche mittels TreeModel implementiert wurden, sind schon definiert. In Deinem Fall würde das wahrscheinlich bedeuten Du überschreibst nur insertNodeInto und kannst dann z.B. prüfen ob der eingefügte Knoten für Deine Liste relevant ist.
 

Marco13

Top Contributor
Es gibt verschiedene Möglichkeiten. Du kannst auch ein DefaultTreeModel verwenden, und dort einen Listener dranhängen, der dann deine Liste aktualisiert.
 

sunnyfriday

Aktives Mitglied
Hallo Michael,

Danke für deine Antwort...

Ich muss aber auch alle Funktionen der TreeModel überschreiben. getChild(), getChildCount(), etc..
die muss ich ja auch anpassen.

Wie sind diese Funktionen in der DefaultTreeModel Klasse implenetiert??? auf welche Datenstruktur werden sie angewendet??

wo kann ich die Implementierungen der Funktionen von DefaultTreeModel anschauen??

Boaaa ... ich finde es echt kompliziert...

Wie gesagt:

Ich habe einfach eine ArrayList<Kunde>

Da möchte ich einfach Kunden über den Tree einfügen, löschen, Reihenfolge ändern. ;-(

Gruss sunny
 

Marco13

Top Contributor
*seufz*
Code:
// Based on [url]http://java.sun.com/docs/books/tutorial/uiswing/examples/components/DynamicTreeDemoProject/src/components/DynamicTreeDemo.java[/url]
// For [url]http://www.java-forum.org/de/viewtopic.php?t=75372&highlight=[/url]


import javax.swing.JEditorPane;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JSplitPane;
import javax.swing.UIManager;

import javax.swing.JTree;
import java.util.*;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeSelectionEvent;
import javax.swing.event.TreeSelectionListener;

import java.net.URL;
import java.io.IOException;
import java.awt.Dimension;
import java.awt.GridLayout;

import java.awt.GridLayout;
import java.awt.Toolkit;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.DefaultMutableTreeNode;
import javax.swing.tree.DefaultTreeModel;
import javax.swing.tree.MutableTreeNode;
import javax.swing.tree.*;
import javax.swing.tree.TreeSelectionModel;
import javax.swing.event.TreeModelEvent;
import javax.swing.event.TreeModelListener;

import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.tree.DefaultMutableTreeNode;

class Customer
{
    private String name;

    public Customer(String name)
    {
        this.name = name;
    }

    public String toString()
    {
        return name;
    }


}


class ListTreeModelListener implements TreeModelListener
{

    private List<Customer> list;

    public ListTreeModelListener(List<Customer> list)
    {
        this.list = list;
    }

    public void treeNodesChanged(TreeModelEvent e)
    {
    }
    public void treeNodesInserted(TreeModelEvent e)
    {
        updateList((TreeModel)e.getSource());
    }
    public void treeNodesRemoved(TreeModelEvent e)
    {
        updateList((TreeModel)e.getSource());
    }
    public void treeStructureChanged(TreeModelEvent e)
    {
    }


    private void updateList(TreeModel treeModel)
    {
        Object root = treeModel.getRoot();
        list.clear();
        int n = treeModel.getChildCount(root);
        for (int i=0; i<n; i++)
        {
            DefaultMutableTreeNode treeNode = (DefaultMutableTreeNode)treeModel.getChild(root, i);
            Object object = treeNode.getUserObject();
            Customer customer = (Customer)object;
            list.add(customer);
        }
        System.out.println("List now: "+list);
    }
}






public class TreeTest3 extends JPanel implements ActionListener {

    private int newNodeSuffix = 1;
    private static String ADD_COMMAND = "add";
    private static String REMOVE_COMMAND = "remove";
    private static String CLEAR_COMMAND = "clear";

    private DynamicTree treePanel;

    public TreeTest3()
    {
        super(new BorderLayout());

        //Create the components.
        treePanel = new DynamicTree();


        //=========================================================

        List<Customer> customers = new ArrayList<Customer>();
        customers.add(new Customer("First"));
        customers.add(new Customer("Second"));
        customers.add(new Customer("Third"));
        customers.add(new Customer("Fourth"));

        for (Customer customer: customers)
        {
            treePanel.addObject(null, customer);
        }

        treePanel.treeModel.addTreeModelListener(new ListTreeModelListener(customers));



        //=========================================================



        JButton addButton = new JButton("Add");
        addButton.setActionCommand(ADD_COMMAND);
        addButton.addActionListener(this);

        JButton removeButton = new JButton("Remove");
        removeButton.setActionCommand(REMOVE_COMMAND);
        removeButton.addActionListener(this);

        JButton clearButton = new JButton("Clear");
        clearButton.setActionCommand(CLEAR_COMMAND);
        clearButton.addActionListener(this);

        //Lay everything out.
        treePanel.setPreferredSize(new Dimension(300, 150));
        add(treePanel, BorderLayout.CENTER);

        JPanel panel = new JPanel(new GridLayout(0,3));
        panel.add(addButton);
        panel.add(removeButton);
        panel.add(clearButton);
        add(panel, BorderLayout.SOUTH);
    }


    public void actionPerformed(ActionEvent e) {
        String command = e.getActionCommand();

        if (ADD_COMMAND.equals(command)) {
            //Add button clicked
            treePanel.addObject(new Customer("New Node " + newNodeSuffix++));
        } else if (REMOVE_COMMAND.equals(command)) {
            //Remove button clicked
            treePanel.removeCurrentNode();
        } else if (CLEAR_COMMAND.equals(command)) {
            //Clear button clicked.
            treePanel.clear();
        }
    }

    /**
     * Create the GUI and show it.  For thread safety,
     * this method should be invoked from the
     * event-dispatching thread.
     */
    private static void createAndShowGUI() {
        //Create and set up the window.
        JFrame frame = new JFrame("TreeTest3");
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        //Create and set up the content pane.
        TreeTest3 newContentPane = new TreeTest3();
        newContentPane.setOpaque(true); //content panes must be opaque
        frame.setContentPane(newContentPane);

        //Display the window.
        frame.pack();
        frame.setVisible(true);
    }

    public static void main(String[] args) {
        //Schedule a job for the event-dispatching thread:
        //creating and showing this application's GUI.
        javax.swing.SwingUtilities.invokeLater(new Runnable() {
            public void run() {
                createAndShowGUI();
            }
        });
    }
}




class DynamicTree extends JPanel {
    protected DefaultMutableTreeNode rootNode;
    public DefaultTreeModel treeModel;
    protected JTree tree;
    private Toolkit toolkit = Toolkit.getDefaultToolkit();




    public DynamicTree() {
        super(new GridLayout(1,0));

        rootNode = new DefaultMutableTreeNode("Root Node");
        treeModel = new DefaultTreeModel(rootNode);

        tree = new JTree(treeModel);
        tree.setEditable(true);
        tree.getSelectionModel().setSelectionMode
                (TreeSelectionModel.SINGLE_TREE_SELECTION);
        tree.setShowsRootHandles(true);

        JScrollPane scrollPane = new JScrollPane(tree);
        add(scrollPane);
    }

    /** Remove all nodes except the root node. */
    public void clear() {
        rootNode.removeAllChildren();
        treeModel.reload();
    }

    /** Remove the currently selected node. */
    public void removeCurrentNode() {
        TreePath currentSelection = tree.getSelectionPath();
        if (currentSelection != null) {
            DefaultMutableTreeNode currentNode = (DefaultMutableTreeNode)
                         (currentSelection.getLastPathComponent());
            MutableTreeNode parent = (MutableTreeNode)(currentNode.getParent());
            if (parent != null) {
                treeModel.removeNodeFromParent(currentNode);
                return;
            }
        }

        // Either there was no selection, or the root was selected.
        toolkit.beep();
    }

    /** Add child to the currently selected node. */
    public DefaultMutableTreeNode addObject(Object child) {
        DefaultMutableTreeNode parentNode = null;
        TreePath parentPath = tree.getSelectionPath();

        if (parentPath == null) {
            parentNode = rootNode;
        } else {
            parentNode = (DefaultMutableTreeNode)
                         (parentPath.getLastPathComponent());
        }

        return addObject(parentNode, child, true);
    }

    public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
                                            Object child) {
        return addObject(parent, child, false);
    }

    public DefaultMutableTreeNode addObject(DefaultMutableTreeNode parent,
                                            Object child,
                                            boolean shouldBeVisible) {
        DefaultMutableTreeNode childNode =
                new DefaultMutableTreeNode(child);

        if (parent == null) {
            parent = rootNode;
        }

    //It is key to invoke this on the TreeModel, and NOT DefaultMutableTreeNode
        treeModel.insertNodeInto(childNode, parent,
                                 parent.getChildCount());

        //Make sure the user can see the lovely new node.
        if (shouldBeVisible) {
            tree.scrollPathToVisible(new TreePath(childNode.getPath()));
        }
        return childNode;
    }

}
 

sunnyfriday

Aktives Mitglied
guten Morgen,

Wow ...danke marco... Das wird mir sicherlich helfen.
Danke vielmals... werde es mir jetzt genauer anschauen.
Danke
 

Marco13

Top Contributor
Relevant sind nur die ersten Beiden Klassen, und der Teil zwischen den "==========". Der Rest ist "Standard" aus dem Swing-Beispiel. (Wäre für dich sicher leichter Nachzuvollziehen, wenn DU einfach DEIN Programm in compilierbarer Form gepostet hättest.... *wink* )
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
F JavaFX (Tree)TableView korrekt drucken AWT, Swing, JavaFX & SWT 1
4a61766120617274697374 dynamische Tree View AWT, Swing, JavaFX & SWT 2
I JavaFX BorderPane ins Tree einfügen AWT, Swing, JavaFX & SWT 11
F Swing Datenmodell in Tree spiegeln ohne Adapterklassen AWT, Swing, JavaFX & SWT 5
T SWT Warum ist mein 1.Tree Node selektiert? AWT, Swing, JavaFX & SWT 11
O Tree path expandieren AWT, Swing, JavaFX & SWT 2
Madlip SWT Tree mit einen Klick alles ausklappen AWT, Swing, JavaFX & SWT 3
J Knotenselect von bestimmten Knoten im Tree AWT, Swing, JavaFX & SWT 2
L SWT tree elemente markieren AWT, Swing, JavaFX & SWT 4
J SWT JFace Tree in Section unsichtbar (Eclipse Forms) AWT, Swing, JavaFX & SWT 5
L SWT Tree reagieren BEVOR selektiert wurde AWT, Swing, JavaFX & SWT 2
S SWT tree collapse AWT, Swing, JavaFX & SWT 4
W SWT Resize Tree-Element AWT, Swing, JavaFX & SWT 3
S Dropdown menu / tree AWT, Swing, JavaFX & SWT 7
P SWT Tree - Keine Selection zulassen AWT, Swing, JavaFX & SWT 4
G Swing Tree wird nicht angezeigt AWT, Swing, JavaFX & SWT 6
B SWT SWT Tree mit mehreren Spalten AWT, Swing, JavaFX & SWT 3
A Swing JTree Tree Node löschen AWT, Swing, JavaFX & SWT 2
K SWT und Tree, wie kann ich TreeItem aus einem Tree entfernen? AWT, Swing, JavaFX & SWT 12
G SWT Tree AWT, Swing, JavaFX & SWT 4
G Bezeichungen im Tree werden durch . gekürzt? AWT, Swing, JavaFX & SWT 5
G Drag And Drop von Component (List, Tree) zum Desktop AWT, Swing, JavaFX & SWT 2
T TREE AWT, Swing, JavaFX & SWT 3
T Tree AWT, Swing, JavaFX & SWT 2
G tree.setSize tut nicht AWT, Swing, JavaFX & SWT 5
S SWT Tree AWT, Swing, JavaFX & SWT 3
U Baum/Tree nach Benutzer anzeigen AWT, Swing, JavaFX & SWT 3
L Renderer mit nativen komponenten in tabelle / tree / list AWT, Swing, JavaFX & SWT 4
R Tree automatisch öffnen AWT, Swing, JavaFX & SWT 7
N Tree automatisch öffnen AWT, Swing, JavaFX & SWT 2
J [SWT] alle Zellen in einem Tree einzeln selektieren AWT, Swing, JavaFX & SWT 2
S TableTree - Tree nicht in erster Spalte AWT, Swing, JavaFX & SWT 5
R Tree-Struktur in einer DB abspeichern AWT, Swing, JavaFX & SWT 15
R Klick in einem Tree erkennen und auswerten AWT, Swing, JavaFX & SWT 6
F Ermittlung der X- und Y- Koordinaten im Tree bei Tastaturst. AWT, Swing, JavaFX & SWT 5
S [S] custom tree componente AWT, Swing, JavaFX & SWT 8
C tree action AWT, Swing, JavaFX & SWT 8
G Tree und expand eines bekannten Pfades AWT, Swing, JavaFX & SWT 5
F Tree-Knoten programmgesteuert auswählen AWT, Swing, JavaFX & SWT 3
J Tree nur mit Ordner anzeigen? AWT, Swing, JavaFX & SWT 4
W SWT - Tree: Problem mit Double-Click expand AWT, Swing, JavaFX & SWT 5
R Nur Verzeichnisse im Tree? AWT, Swing, JavaFX & SWT 5
G verzeichnis tree erstellen AWT, Swing, JavaFX & SWT 2
V Tree Ausgabe Problem AWT, Swing, JavaFX & SWT 2
Linjutsu Den Inhalten aus einer ArrayList Bilder zuweisen (Kartenspiel) AWT, Swing, JavaFX & SWT 8
mrbody234 ArrayList<Message> in eine TableView visualisieren AWT, Swing, JavaFX & SWT 2
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
S ChoiceBox aus ArrayList per setValue() mit Wert belegen funktioniert nicht. AWT, Swing, JavaFX & SWT 0
BananenBrötchen Swing Arraylist in jList anzeigen AWT, Swing, JavaFX & SWT 6
W Clear Canvas und anschließendes neues Erstellen von Objekten auf Canvas aus ArrayList AWT, Swing, JavaFX & SWT 4
missy72 JavaFX ObservableList in einer ArrayList speichern. AWT, Swing, JavaFX & SWT 7
B ArrayList, Strings anzeigen AWT, Swing, JavaFX & SWT 1
S JavaFx - ausgewählte Rows in Arraylist (Tableview) AWT, Swing, JavaFX & SWT 4
A Swing Wie Daten in der Form speichern? Array oder ArrayList AWT, Swing, JavaFX & SWT 2
K Swing JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 4
GreenTeaYT Wie vergebe Ich den Jframe Title den Namen aus einem Element von der Arraylist ? AWT, Swing, JavaFX & SWT 4
B Klasse mit ArrayList AWT, Swing, JavaFX & SWT 1
I JTable dynamisch aus ArrayList befüllen AWT, Swing, JavaFX & SWT 3
ZoXlike Wie kann man ArrayList in JTabel einlesen? [WindowBuilder] AWT, Swing, JavaFX & SWT 1
D Swing ArrayList in Jlist/ List oder Array in JList/List AWT, Swing, JavaFX & SWT 5
E Eigenes TableModel für ArrayList<String[]> AWT, Swing, JavaFX & SWT 5
S ArrayList Problem AWT, Swing, JavaFX & SWT 3
T JTable dynamisch mit ArrayList AWT, Swing, JavaFX & SWT 2
S Swing JList, ArrayList + DefaultModel AWT, Swing, JavaFX & SWT 5
Ollek JList - neuer Eintrag in ArrayList dadurch keine Anzeige der Objekte AWT, Swing, JavaFX & SWT 18
T Swing Ausgabe aus ArrayList in Klasse1 in jTextArea in Klasse2 AWT, Swing, JavaFX & SWT 2
E Problem mit ArrayList AWT, Swing, JavaFX & SWT 7
P Auf gefüllte ArrayList zugreifen AWT, Swing, JavaFX & SWT 12
P ArrayList Rectangles2D AWT, Swing, JavaFX & SWT 29
O JComboBox mit ArrayList füllen AWT, Swing, JavaFX & SWT 3
D Probleme bei Übertrag von ArrayList in Jtable AWT, Swing, JavaFX & SWT 2
F Swing ArrayList in JList anzeigen und Objekte auswählen AWT, Swing, JavaFX & SWT 2
L AWT paint mit ArrayList und Iterator AWT, Swing, JavaFX & SWT 3
Z Swing JButton,JFrame, ArrayList & so weiter... AWT, Swing, JavaFX & SWT 20
C Swing NullPointerException beim Hinzufügen von Checkboxes in eine ArrayList AWT, Swing, JavaFX & SWT 5
G Swing Elemente aus Arraylist auf JFrame anzeigen AWT, Swing, JavaFX & SWT 9
S JTable - 2D ArrayList & Falsche Werte. AWT, Swing, JavaFX & SWT 3
Screen Fehler bei Get-Methode für ArrayList AWT, Swing, JavaFX & SWT 8
M Swing JTable soll auf ArrayList zugreifen AWT, Swing, JavaFX & SWT 8
B Swing JButtons in eine Arraylist<JButton> einfügen AWT, Swing, JavaFX & SWT 2
J Daten aus einer Textdatei in ArrayList holen AWT, Swing, JavaFX & SWT 9
J ArrayList Inhalt zählen AWT, Swing, JavaFX & SWT 53
J ArrayList Datensätze komplett löschen AWT, Swing, JavaFX & SWT 8
J ArrayList Datensätze auswerten AWT, Swing, JavaFX & SWT 10
Y Swing Aktualisieren eines JPanel mit ArrayList im TableLayout AWT, Swing, JavaFX & SWT 2
L ArrayList Wert löschen klappt nicht AWT, Swing, JavaFX & SWT 11
M ArrayList in 2D Array umfüllen AWT, Swing, JavaFX & SWT 9
C Swing ArrayList in JComboBox AWT, Swing, JavaFX & SWT 6
H ArrayList?! in Tabelle AWT, Swing, JavaFX & SWT 3
B ArrayList in JTable AWT, Swing, JavaFX & SWT 3
B ArrayList im JTextArea anzeigen lassen AWT, Swing, JavaFX & SWT 30
Ollek JTable - Tabelle füllen mit einer ArrayList AWT, Swing, JavaFX & SWT 22
T ArrayList aus KlasseA in KlasseB in JTextArea ausgeben AWT, Swing, JavaFX & SWT 12
KrokoDiehl EventListenerList vs. ArrayList AWT, Swing, JavaFX & SWT 3
I Swing JTree aus ArrayList<File> erzeugen AWT, Swing, JavaFX & SWT 15
C Swing ArrayList in jList AWT, Swing, JavaFX & SWT 3
Spot84 jtable mit checkboxnode dynamisch per arraylist füllen AWT, Swing, JavaFX & SWT 8
G Wie lasse ich einen Graphen zeichnen(mit einer ArrayList)? AWT, Swing, JavaFX & SWT 5
nadal15 JTable und ArrayList - selected rows löschen AWT, Swing, JavaFX & SWT 6
G JTable - TableModel aus ArrayList AWT, Swing, JavaFX & SWT 8

Ähnliche Java Themen

Neue Themen


Oben