JTrees synchronisieren

Status
Nicht offen für weitere Antworten.

Generic1

Top Contributor
Hallo,

ich habe ein spezielles Problem und zwar befinden sich auf meiner Applikations GUI bis zu 3 JTrees. diese 3 JTrees sind jeweils aus der gleichen Klasse erzeugt worden (die 3 Objekte sind also gleich),
auf diesen JTrees befindet sich ein PopupMenu, mit dem ich Knoten hinzufügen und löschen kann.
Wenn ich das bei einem JTree mache (z.B.: einen Knoten hinzufügen), dann soll bei den beiden anderen JTrees das gleiche passieren (also auch ein Knoten hinzugefügt werden), die bis zu 3 JTrees sollen sich also gegenseitig synchronisieren, "bis zu" -> weil nicht immer alle 3 JTrees sichtbar sind.

Meine Frage wäre jetzt, wie macht man das am Besten, mit einem Observer oder mit einem PropertyChangeListener, oder lösche ich die beiden anderen JTreeObjekte und erzeuge neue.
Vielleicht hat dazu jemand eine Idee

Besten Dank,
Generic
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Du denkst viel zu kompliziert! Ein JTree ist eine Komponente mit einem Modell. Dieselbe Instanz eines Modells kann in mehreren Komponenten benutzt werden. Wenn alle Bäume das selbe Modell haben, haben sie auch -- zwangsweise -- den selben Inhalt. Das scheint zu sein was Du willst. Beispiel: [HIGHLIGHT="Java"]public static void main(String[] args) {
final DefaultMutableTreeNode root = new DefaultMutableTreeNode("root");
root.add(new DefaultMutableTreeNode("Child 1"));
root.add(new DefaultMutableTreeNode("Child 2"));
root.add(new DefaultMutableTreeNode("Child 3"));

final DefaultTreeModel treeModel = new DefaultTreeModel(root);

final JButton button = new JButton("Add a child");
button.addActionListener(new ActionListener() {

@Override
public void actionPerformed(ActionEvent e) {
final int index = root.getChildCount();
treeModel.insertNodeInto(new DefaultMutableTreeNode("Child "
+ (index + 1)), root, index);
}
});

final JPanel treePanel = new JPanel(new GridLayout(2, 2, 6, 6));
treePanel.add(new JScrollPane(new JTree(treeModel)));
treePanel.add(new JScrollPane(new JTree(treeModel)));
treePanel.add(new JScrollPane(new JTree(treeModel)));
treePanel.add(new JScrollPane(new JTree(treeModel)));
treePanel.setPreferredSize(new Dimension(300, 300));

final JPanel panel = new JPanel(new BorderLayout(6, 6));
panel.add(treePanel);
panel.add(button, BorderLayout.SOUTH);

final JFrame f = new JFrame("Four Trees");
f.setContentPane(panel);
f.pack();
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
f.setVisible(true);
}[/HIGHLIGHT]

Ebenius
 
Zuletzt bearbeitet:

Generic1

Top Contributor
@Ebenius
Vielen Dank, das ist im Grunde genau das was ich brauche.
Mein Problem ist jetzt noch, dass ich eine TreeTable habe und mir ist jetzt nicht ganz klar, wie ich das mit dem TableModel mache, sodass es dieses TableModel auch nur einmal gibt und nur auf diesem opertiert wird,

Unten hab ich den Code gepostet, wie ich es jetzt gemacht habe, mit den JTrees klappt es schon, die Tables zu den einzelnen JTrees sind noch das Problem,

Besten Dank,
Generic1


Code:
// wird 3 mal aufgerufen, wie oben geschrieben:

public void createMainTree() {
       MainTreeModel mainTreeModel = MainTreeModel.getInstance(treeNodesCreation.createTree(states, 
ROOTNAME));  // nur ein TreeModel, alle Trees (View) operieren auf dem selben Model
        mainTree = new JTree(mainTreeModel);       
        mainTree.getModel().addTreeModelListener(this);       
        final TableAdapter adapter = new TableAdapter(mainTree);
        table = new Table(adapter);
 

Ebenius

Top Contributor
Ich weiß nicht genau um was für eine TreeTable es sich handelt. Aber ich würde das TreeTableModel-Interface selbst implementieren und zwar so, dass es auf dem TreeModel arbeitet.

Ebenius
 

Generic1

Top Contributor
Ich weiß nicht genau um was für eine TreeTable es sich handelt. Aber ich würde das TreeTableModel-Interface selbst implementieren und zwar so, dass es auf dem TreeModel arbeitet.

Ebenius

Hallo nochmal,
vielleicht kann ja mal jemand drüberschauen.
Besten Dank,
Generic1
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Bevor ich mich da reinwühle: Du suchst nicht einfach nur eine TreeTable, oder? Falls doch, gibt's bei Sun einen guten Article: Creating TreeTables in Swing, der IMHO einen besseren Ansatz verfolgt. In dem Fall gibt's ein TreeTableModel welches vom TreeModel erbt. Und dann wird auch alles wunderbar.

Wenn Du andere Wege gehst und Dich nicht an das Model-View-Controller-Konzept hältst, dann stehst Du plötzlich vor solchen Problemen wie "Wie synchronisier ich das jetzt?", und noch vor einigen mehr... ;)

Ebenius
 

Generic1

Top Contributor
Bevor ich mich da reinwühle: Du suchst nicht einfach nur eine TreeTable, oder? Falls doch, gibt's bei Sun einen guten Article: Creating TreeTables in Swing,
Ebenius

Mit dem habe ich vorher gearbeitet, ich hab es aber nicht geschafft, neue Nodes bzw. Rows zur Laufzeit (D&D bzw. mit einem Button) hinzuzufügen und deshalb hab ich jetzt das Beispiel welches ich oben veröffentlicht habe.
Meines erachtens ist es nicht mehr viel, um mein Beispiel oben zum laufen zu bringen.
Also ich würde das unbedingt benötigen,
Vielleicht kannst Du/kann jemand ja kurz drüberschaun,

Vielen Dank,
 
Zuletzt bearbeitet:

Ebenius

Top Contributor
Meines erachtens ist es nicht mehr viel, um mein Beispiel oben zum laufen zu bringen.
Ich hab's mir eben angesehen und ich bin überzeugt, dass es noch einigen Aufwand macht, das Beispiel oben sinnvoll zum Laufen zu bekommen. Da Du in Deinem Tabellenmodell eine Referenz zum JTree hast, kannst Du das selbe Modell nicht in mehreren Tabellen benutzen und schon bekommst Du Probleme.

Steck doch lieber den Aufwand in die JTreeTable-Lösung. Das sieht erstens besser aus und ist zweitens schon von einigen hunderttausend Entwicklern erprobt. Wo liegt denn das Problem mit dem Löschen von Knoten in der JTreeTable?

Ebenius
 
Status
Nicht offen für weitere Antworten.

Ähnliche Java Themen

Neue Themen


Oben