Hallo,
versuche mich gerade im Schreiben eines eigenen TreeModels.
Alles funktioniert soweit, nur dass beim Entfernen von Nodes die Anzeige nicht aktualisiert wird.
Hier meine Nodes:
So sieht mein Model aus:
und das ist mein Hauptfenster:
Klicke ich auf "Save", so sehe ich, dass meine Nodes auch tatsächlich entfernt werden.
Nur werden sie im Tree trotzdem noch angezeigt!
Kann mir irgendwer sagen was ich falsch mache?!
mfg, guni
versuche mich gerade im Schreiben eines eigenen TreeModels.
Alles funktioniert soweit, nur dass beim Entfernen von Nodes die Anzeige nicht aktualisiert wird.
Hier meine Nodes:
Java:
package com.guni;
import java.util.Vector;
public class Marker {
private static final long serialVersionUID = 1L;
private String heading;
private Marker parent;
private Vector<Marker> children;
public Marker(String heading) {
super();
this.heading = heading;
this.parent = null;
this.children = new Vector<Marker>();
}
public void setHeading(String heading) {
this.heading = heading;
}
public String getHeading() {
return this.heading;
}
public void setParent(Marker m) {
this.parent = m;
}
public Marker getParent() {
return this.parent;
}
public void add(Marker m) {
m.parent = this;
this.children.add(m);
}
public void add(int index, Marker m) {
m.parent = this;
this.children.add(index, m);
}
public void remove(Marker m) {
this.children.remove(m);
}
public void remove(int index) {
this.children.remove(index);
}
public Marker get(int index) {
return this.children.get(index);
}
public int countChildren() {
return this.children.size();
}
public boolean isLeaf() {
return countChildren() == 0;
}
public void dump() {
for (int i=0; i<countChildren(); i++) {
Marker child = children.get(i);
System.out.println(child);
child.dump();
}
}
public String toString() {
return this.heading;
}
}
So sieht mein Model aus:
Java:
package com.guni;
import javax.swing.event.TreeModelListener;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreePath;
public class MarkerTreeModel implements TreeModel {
private Marker root;
public MarkerTreeModel(Marker root) {
this.root = root;
}
@Override
public Object getChild(Object node, int index) {
Marker m = (Marker) node;
return m.get(index);
}
@Override
public int getChildCount(Object node) {
Marker m = (Marker) node;
return m.countChildren();
}
@Override
public int getIndexOfChild(Object parent, Object child) {
int i;
Marker p = (Marker) parent;
Marker c = (Marker) child;
for (i = p.countChildren(); i > -1; i--) {
if (p.get(i).equals(c)) {
break;
}
}
return i;
}
@Override
public Object getRoot() {
return root;
}
@Override
public boolean isLeaf(Object node) {
Marker m = (Marker) node;
return m.isLeaf();
}
@Override
public void addTreeModelListener(TreeModelListener l) {
}
@Override
public void removeTreeModelListener(TreeModelListener l) {
}
@Override
public void valueForPathChanged(TreePath path, Object newValue) {
}
}
und das ist mein Hauptfenster:
Java:
package com.guni;
import java.awt.BorderLayout;
import java.awt.Dimension;
import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.JTree;
import javax.swing.tree.TreeModel;
import javax.swing.tree.TreeSelectionModel;
public class MainWindow extends JFrame implements ActionListener {
private static final long serialVersionUID = 1L;
private Marker rootnode;
private JTree tree;
public static void main(String[] args) throws Exception {
new MainWindow();
}
public MainWindow() throws Exception {
init();
TreeModel model = new MarkerTreeModel(rootnode);
JPanel treepanel = new JPanel(new FlowLayout());
JPanel commandpanel = new JPanel(new FlowLayout());
tree = new JTree(model);
tree.getSelectionModel().setSelectionMode(TreeSelectionModel.SINGLE_TREE_SELECTION);
JScrollPane treeView = new JScrollPane(tree);
JButton btnAdd = new JButton("Add");
JButton btnRemove = new JButton("Remove");
JButton btnRename = new JButton("Rename");
JButton btnSave = new JButton("Save");
treeView.setPreferredSize(new Dimension(400,400));
btnAdd.addActionListener(this);
btnRemove.addActionListener(this);
btnRename.addActionListener(this);
btnSave.addActionListener(this);
treepanel.add(treeView);
commandpanel.add(btnAdd);
commandpanel.add(btnRemove);
commandpanel.add(btnRename);
commandpanel.add(btnSave);
this.getContentPane().add(treepanel, BorderLayout.NORTH);
this.getContentPane().add(commandpanel, BorderLayout.SOUTH);
this.setTitle("Sermon Player");
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
this.pack();
this.setLocationRelativeTo(null);
this.setVisible(true);
}
public void init() {
rootnode = new Marker("Root");
Marker unterpunkt1 = new Marker("Punkt 1");
unterpunkt1.add(new Marker("Detail A"));
unterpunkt1.add(new Marker("Detail B"));
unterpunkt1.add(new Marker("Detail C"));
unterpunkt1.add(new Marker("Detail D"));
rootnode.add(unterpunkt1);
rootnode.add(new Marker("Punkt 2"));
rootnode.add(new Marker("Punkt 3"));
rootnode.add(new Marker("Punkt 4"));
}
@Override
public void actionPerformed(ActionEvent e) {
String command = e.getActionCommand().toLowerCase();
Marker m = (Marker) tree.getLastSelectedPathComponent();
if (e != null) {
if (command.equals("add")) {
String heading = JOptionPane.showInputDialog("Bitte Titel des Absatzes eingeben: ");
Marker child = new Marker(heading);
m.add(child);
tree.repaint();
} else if (command.equals("remove")) {
System.out.println("Removing node " + m);
Marker parent = m.getParent();
if (parent != null) {
System.out.println(parent);
parent.remove(m);
} else {
System.out.println("Can't remove root node");
}
tree.repaint();
} else if (command.equals("rename")) {
String heading = JOptionPane.showInputDialog("Bitte Titel des Absatzes eingeben: ");
m.setHeading(heading);
tree.repaint();
} else if (command.equals("save")) {
rootnode.dump();
}
}
}
}
Klicke ich auf "Save", so sehe ich, dass meine Nodes auch tatsächlich entfernt werden.
Nur werden sie im Tree trotzdem noch angezeigt!
Kann mir irgendwer sagen was ich falsch mache?!
mfg, guni