Darstellungsproblem des eigenen TreeModel bei Veränderungen

Status
Nicht offen für weitere Antworten.

dwn8

Mitglied
Hallo,

das TreeModel wird richtig dargestellt, wenn der JTree initialisiert wird. Jedoch funktioniert es nicht Blätter zu löschen oder zu adden. Ich schicke ein TreeModelEvent los, jedoch passiert nichts und ich komm dem Fehler einfach nicht auf die Spur. So hier erstmal der Code.

Code:
public class AccountTreeModel extends AbstractTreeModel implements Serializable {

	private static final long serialVersionUID = -2517899978776523557L;

	List<Account> accountList;
	
	public AccountTreeModel() {
		accountList = new ArrayList<Account>();
	}
	
	public AccountTreeModel(Map<String, Account> accountData) {
		this();
		setData(accountData);
	}
	
	public void setData(Map<String, Account> accountData) {
		for ( Map.Entry<String, Account> e : accountData.entrySet() ) {
			accountList.add(e.getValue());
		}
	}

	@Override
	public Object getChild(Object parent, int index) {
		return accountList.get(index);
	}

	@Override
	public int getChildCount(Object parent) {
		return accountList.size();
	}

	@Override
	public int getIndexOfChild(Object parent, Object child) {
		int result = -1;
		if (child instanceof Account) {
			Account account = (Account) child;
			for (int i = 0; i < accountList.size(); i++) {
				if (accountList.get(i).equals(account)) {
					result = i;
					break;
				}
			}
		}
		return result;
	}

	@Override
	public Object getRoot() {
		return accountList;
	}

	@Override
	public boolean isLeaf(Object node) {
		return (node instanceof Account);
	}

	@Override
	public void valueForPathChanged(TreePath path, Object newValue) {
	}
	
	public void add(Account account) {
		accountList.add(account);
		
		Account[] accountToAdd = {account};
		TreePath path = new TreePath(getRoot());
		int[] addedAccountIndex = {getIndexOfChild(null,account)};
		System.out.println(getIndexOfChild(null,account));
		TreeModelEvent event = new TreeModelEvent(this, path, addedAccountIndex, accountToAdd);
		fireTreeNodesInserted(event);
	}
	
	public void remove(Account account) {
		Account[] accountToRemove = {account};
		TreePath path = new TreePath(getRoot());
		int[] addedAccountIndex = {getIndexOfChild(null, account)};
		accountList.remove(account);
		
		TreeModelEvent event = new TreeModelEvent(this, path, addedAccountIndex, accountToRemove);
		fireTreeNodesRemoved(event);
	}

}
Code:
public abstract class AbstractTreeModel extends TreeModelSupport implements TreeModel {
}
Code:
public class TreeModelSupport {
	
   private List<TreeModelListener> list = new ArrayList<TreeModelListener>();

   public void addTreeModelListener( TreeModelListener listener ) {
      if ( listener != null && !list.contains( listener ) ) {
         list.add( listener );
      }
   }

   public void removeTreeModelListener( TreeModelListener listener ) {
      if ( listener != null ) {
         list.remove( listener );
      }
   }

   public void fireTreeNodesChanged( TreeModelEvent e ) {
      Enumeration<TreeModelListener> listeners = Collections.enumeration(list);
      while ( listeners.hasMoreElements() ) {
         TreeModelListener listener = (TreeModelListener)listeners.nextElement();
         listener.treeNodesChanged( e );
      }
   }

   public void fireTreeNodesInserted( TreeModelEvent e ) {
      Enumeration<TreeModelListener> listeners = Collections.enumeration(list);
      while ( listeners.hasMoreElements() ) {
         TreeModelListener listener = (TreeModelListener)listeners.nextElement();
         listener.treeNodesInserted( e );
      }
   }

   public void fireTreeNodesRemoved( TreeModelEvent e ) {
      Enumeration<TreeModelListener> listeners = Collections.enumeration(list);
      while ( listeners.hasMoreElements() ) {
         TreeModelListener listener = (TreeModelListener)listeners.nextElement();
         listener.treeNodesRemoved( e );
      }
   }

   public void fireTreeStructureChanged( TreeModelEvent e ) {
      Enumeration<TreeModelListener> listeners = Collections.enumeration(list);
      while ( listeners.hasMoreElements() ) {
         TreeModelListener listener = (TreeModelListener)listeners.nextElement();
         listener.treeStructureChanged( e );
      }
   }
}

Gruß
dwn8
 
M

MiDniGG

Gast
Sorry bin zu faul was zu erklären ^^ Und zu ändern deswegen 1:1 abkopiert vllt hilfts ja :)

Beispiel am Löschen:

Code:
try
			{
				if(tree.getSelectionPath() != null)
				{
					int mDel = JOptionPane.showConfirmDialog(this, "Wollen Sie \"" + selectedNode + "\" wirklich löschen?", "Sind Sie sicher?", JOptionPane.YES_NO_OPTION);
					if(mDel == JOptionPane.YES_OPTION)
					{
						selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
						selectedNode.removeFromParent();
					}
					else
					{
						
					}
				}
			}
			catch(NullPointerException e)
			{
				e.printStackTrace();
			}

Code:
DefaultMutableTreeNode selectedNode = null;
.....
selectedNode = (DefaultMutableTreeNode) tree.getLastSelectedPathComponent();
 

dwn8

Mitglied
Ich benutze jedoch ein eigenes TreeModel und meine Nodes sind vom Typ Account.
Das Aktualisieren des JTree funktioniert mittels updateUI(). Soweit ich jedoch verstanden hab, sollte man die Aktualisierung über die Listener machen. Und genau dies funktioniert bei mir aus irgend einem Grund nicht.
 

dwn8

Mitglied
OK hab es jetzt damit probiert:
Code:
fireTreeStructureChanged(new TreeModelEvent(this, new TreePath(getRoot()), null, null));
Und es hat geklappt.
Die Methoden
Code:
fireTreeNodesRemoved(event) 
fireTreeNodesInserted(event)
klappen jedoch noch immer nicht.
 

André Uhres

Top Contributor
Versuch's mal so:
Code:
...
    private DefaultMutableTreeNode root = new DefaultMutableTreeNode("Accounts");
...
    @Override
    public Object getRoot() {
        return root;
    }
...
 

dwn8

Mitglied
Unglaublich es klappt. Darauf wäre ich nie gekommen.
Das heißt wohl, dass nicht jedes Objekt als root akzeptiert wird, wenn es um die Aktualisierung geht.
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
S JSF Darstellungsproblem AWT, Swing, JavaFX & SWT 0
VfL_Freak Darstellungsproblem mit Dialog AWT, Swing, JavaFX & SWT 8
H Swing Darstellungsproblem JPanel in JPanel in JScrollpane in JSplitPane AWT, Swing, JavaFX & SWT 4
heart_disease Darstellungsproblem mit JTable AWT, Swing, JavaFX & SWT 4
G Darstellungsproblem mehrerer Komponenten AWT, Swing, JavaFX & SWT 9
S Darstellungsproblem mit JButton AWT, Swing, JavaFX & SWT 3
H Darstellungsproblem mit Kartenspiel AWT, Swing, JavaFX & SWT 3
V Darstellungsproblem mit Canvas AWT, Swing, JavaFX & SWT 6
Encera ArrayList mit eigenen Objekten in JavaFX sortieren und ausgeben AWT, Swing, JavaFX & SWT 50
maximizer JavaFX Accordion mit eigenen TitledPanes füllen AWT, Swing, JavaFX & SWT 0
P JavaFX Zugriff auf Fenster/Layout-Container in eigenen Klassen AWT, Swing, JavaFX & SWT 5
F jTree und das Model aus einer eigenen Klasse AWT, Swing, JavaFX & SWT 1
J Drag and Drop von eigenen Objekten AWT, Swing, JavaFX & SWT 3
K Panels mit eigenen Controllern in Main-View einbauen AWT, Swing, JavaFX & SWT 4
B SWT Problem: Wie kann man für jede TableColumn einen eigenen KeyListener registrieren. AWT, Swing, JavaFX & SWT 1
G LookAndFeel Tutorial für Erstellung eines eigenen Look And Feel AWT, Swing, JavaFX & SWT 3
S Swing Eigenen Button schreiben AWT, Swing, JavaFX & SWT 6
B Eigenen Look&Feel erstellen?! AWT, Swing, JavaFX & SWT 2
S Swing Eigenen JDialog mit Rückgabewert AWT, Swing, JavaFX & SWT 3
H Verschiedene JPanels aus eigenen Klassen in JFrame einfügen, nur ein Panel sichtbar AWT, Swing, JavaFX & SWT 4
Z andere Programmfenster relativ zum eigenen maximieren AWT, Swing, JavaFX & SWT 4
B Swing Eigenen Cursor setzen AWT, Swing, JavaFX & SWT 10
J Eigenen Parser schreiben AWT, Swing, JavaFX & SWT 8
N Swing eigenen Dialog erstellen AWT, Swing, JavaFX & SWT 8
jueki eigenen Button in JFileChooser einfügen AWT, Swing, JavaFX & SWT 7
M JTree mit eigenen Knoten - Zugriff auf Daten AWT, Swing, JavaFX & SWT 6
E Eigenen RowSorter AWT, Swing, JavaFX & SWT 11
P Swing eigenen Modalen JDialog AWT, Swing, JavaFX & SWT 6
data89 Swing Eigenen Fensterrahmen und (Fenster-)Erweiterungen erstellen AWT, Swing, JavaFX & SWT 7
S Swing editable JCombobox mit eigenen Einträgen manangen AWT, Swing, JavaFX & SWT 5
S AWT Eigenen Cursor im Frame verwenden... AWT, Swing, JavaFX & SWT 5
F Drag & Drop mit eigenen Komponenten AWT, Swing, JavaFX & SWT 2
GilbertGrape ActionListener implementieren oder Eigenen für jede Komponente? AWT, Swing, JavaFX & SWT 9
G Hilfe beim Erstellen eines eigenen Html-Editors! AWT, Swing, JavaFX & SWT 4
C JScrollpane eigenen jScrollBar einfügen AWT, Swing, JavaFX & SWT 2
G eigenen Observer schreiben AWT, Swing, JavaFX & SWT 6
J Drag & Drop : JLabel -> JLabel (eigenen Datentyp über AWT, Swing, JavaFX & SWT 2
S JTree mit eigenen Objekten füllen AWT, Swing, JavaFX & SWT 4
isowiz Einige Fragen zur ersten eigenen Sing-Applikation AWT, Swing, JavaFX & SWT 4
M Symbole beim eigenen Renderer AWT, Swing, JavaFX & SWT 7
F Eigenen JDialog öffnen? AWT, Swing, JavaFX & SWT 4
J JFrame mit eigenen Button minimieren AWT, Swing, JavaFX & SWT 2
N Methode für Bild laden geht nur in der eigenen Klasse... AWT, Swing, JavaFX & SWT 3
X Swing 2 TreeModel und ein JTree synchronisieren AWT, Swing, JavaFX & SWT 3
O JTree/TreeModel/DefaultMutableTreeNodes thread safe machen AWT, Swing, JavaFX & SWT 3
C Swing JTree und TreeModel AWT, Swing, JavaFX & SWT 15
O Swing TreeModel reload nur scheinbar AWT, Swing, JavaFX & SWT 2
S JTree mit Daten aus Model füllen, eigenes TreeModel (gute Dokumentation des Problems) AWT, Swing, JavaFX & SWT 2
M JTree und TreeModel mit 2 Klassen AWT, Swing, JavaFX & SWT 3
T JTree - TreeModel AWT, Swing, JavaFX & SWT 3
B JTree & Treemodel AWT, Swing, JavaFX & SWT 3
J JTree/TreeModel add/delete Methoden AWT, Swing, JavaFX & SWT 2
H JTree und TreeModel AWT, Swing, JavaFX & SWT 4
M Wie einen JTable editierbar machen (mit eigenem TreeModel) AWT, Swing, JavaFX & SWT 2
C TreeModel zu langsam für EventDispatchThread AWT, Swing, JavaFX & SWT 5
T TreeModel: Ändern der Folderanzeige AWT, Swing, JavaFX & SWT 3
A (Default)TreeModel und wie die Daten hinein bekommen AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen

Neue Themen


Oben