# Komplette GUI reloaden



## Guest (9. Mrz 2006)

Hallo

gibt es in Java keine möglichkeit, das aktuelle JFrame komplett neu zu laden!?

also Treeview etc. zu aktualisieren ?!

:-(

such jetzt schon 3 Stunden und finde gar nichts :-(


----------



## AlArenal (9. Mrz 2006)

Wozu sollte das nötig sein?


----------



## Guest (9. Mrz 2006)

Hm

der Inhalt meines Treeviews hat sich geändert


und das würde ich dem Benutzer auch gerne zeigen :-/


----------



## AlArenal (9. Mrz 2006)

Wenn du die Daten vom Model änderst, musst du entsprechende Events abfeuern lassen, damit der View das auch mitbekommt und die Anzeige erneuert. Ich kauf mir auch kein neues Auto, wenn der Tank leer ist...


----------



## Guest (9. Mrz 2006)

Und was wäre ein solcher Event?

ich verstehe nicht so ganz, was ich machen soll ???


----------



## norman (9. Mrz 2006)

evtl. http://java.sun.com/j2se/1.5.0/docs/api/javax/swing/event/TreeModelListener.html


----------



## Guest (9. Mrz 2006)

Jetzt nur mal angenommen, ich würde mir einen Button "Aktualisieren" machen,

damit könnte ich doch auch einen solchen Event auslösen oder?

ich habe momentan einen Button, mit dessen hilfe ich einen Knopten aus dem Treeview entferne

nachdem der knoten entfernt wurde, muss ich ja den Baum neu laden... richtig oder?

welchen befehl verwende ich da?


myTree.?????();


----------



## L-ectron-X (9. Mrz 2006)

Einfach mal in die FAQ gucken...
http://www.java-forum.org/de/viewtopic.php?p=150581


----------



## Guest (9. Mrz 2006)

Vielleicht sollte ich für heute einfach feierabend machen, vielleicht kapier ichs morgen .... :-(

also hier noch mal die zusammenfassung

ich hole mir Daten aus einer Datenbank
stelle diese im Treeview dar

dann kann ich durch markieren eines elementes im Treeview und anschließendes anklicken eines Buttons den eintrag aus der Datenbank löschen

dann hole ich mir den neuen Treeview aus der Datenbank und möchte diesen nun darstellen

und genau hier hängt es....... es geht einfach nicht


na ja wie gesagt... vielleicht kapier ichs morgen (glaub ich aber ehr nicht)  :lol:


----------



## AlArenal (9. Mrz 2006)

Zunächst einmal ist das ein falscher Ansatz. Du kannst nicht bei jeder Änderung einfach alle Daten neu ladenl. Ist doch Overkill... Was spricht dagegen den Eintrag in der DB und im Model zu löschen? Dadurch spart man sich das komplette Neuladen der Daten.


----------



## L-ectron-X (9. Mrz 2006)

Würde es nicht auch nur genügen die Daten einmal bei Programmstart ins Model einzulesen, im weiteren Verlauf ausschließlich mit dem Model zu arbeiten und beim Beenden des Programms die Daten in die DB zu schreiben?


----------



## Guest (9. Mrz 2006)

Nein, das würde nicht genügen

sobald ich eienen eintrag ausgewählt habe und auf löschen klicke, soll dieser sofort in der Datenbank gelöscht werden und der Treeview aktualisiert werden...... :-/

hab das problem mit der GUI aber auch noch an anderen stellen

kann man da wirklich nicht einfach nen refesh befehl oder ähnliches absetzen ?


----------



## AlArenal (9. Mrz 2006)

Anonymous hat gesagt.:
			
		

> kann man da wirklich nicht einfach nen refesh befehl oder ähnliches absetzen ?



Klar, per Event..


----------



## Guest (9. Mrz 2006)

ja coole sache

und welchen Befehl ?

haste vielleicht mal n beipiel ?


----------



## norman (9. Mrz 2006)

beispiel? hier :arrow: http://www.java-forum.org/de/viewtopic.php?p=173805#173805 :wink:
(das mit den events hatten wir doch oben schon?)


----------



## Guest (9. Mrz 2006)

Sorry aber ich steh auf m schlauch 
na ja egal

vielleicht find ich woanders noch hilfe :-/


----------



## Guest (10. Mrz 2006)

hallo

ich versuchs jetzt noch einmal

ich hab einen JTree meinbaum;

und einen Button btn_aktualisieren

was für ein code muss bei dem button in den Event teil für Mouse clicked wenn dann der Baum aktualisiert werden soll

der baum bekommt komplett neue Daten

also zuerst hat der die daten aus z.B. aus der methode

tree = stools.getTree1();

und bevor der button geklickt wird, bekommt der die daten

tree = stools.getTree2();

und dann muss die ansicht aktualisiert werden


jemand ne idee ?

bitte mit beispielcode wenns nit zu viel verlangt ist


----------



## norman (10. Mrz 2006)

wie schon gesagt, du musst an deinem tree einen TreeModelListener anmelden. der reagiert dann, wenn: 





			
				API hat gesagt.:
			
		

> void treeNodesChanged(TreeModelEvent e)
> Invoked after a node (or a set of siblings) has changed in some way.
> 
> void treeNodesInserted(TreeModelEvent e)
> ...


----------



## Guest (10. Mrz 2006)

ja ich mitlererweile (du hast es ja schon oft genug geschrieben) weis ich dass ich das anmelden muss

meine frage ist nur WIE ich den anmelden muss......

nicht WAS sondern WIE ;-) :-D


----------



## Roar (10. Mrz 2006)

du must gar nix nirgendwo anmelden.
du hast dein TreeModel, dort änderst du die daten, der JTree wird automatisch aktualisiert, wenn du a) die DefaultTreeModel implementierung verwendest oder ein eigenes Model schreibst, welches TreeModelEvent feuern kann.


----------



## Guest (10. Mrz 2006)

da wird gar nix aktualisiert, sonst hätte ich den thread ja nicht eröffnet :-(


----------



## norman (10. Mrz 2006)

kannst du nicht etwas code posten?


----------



## Guest (10. Mrz 2006)

```
private JTree getUserTree() {
		if (userTree == null) {
			userTree = stools.getUserTree();
		}
		return userTree;
	}


private JButton getBtn_deleteUser() {
		if (btn_deleteUser == null) {
			btn_deleteUser = new JButton();
			btn_deleteUser.setBounds(new java.awt.Rectangle(241,30,86,28));
			btn_deleteUser.setText("Löschen");
			btn_deleteUser.addMouseListener(new java.awt.event.MouseAdapter() {
				public void mouseClicked(java.awt.event.MouseEvent e) {
					TreePath path = userTree.getSelectionPath();
					Object[] o = path.getPath();
					boolean status = dtools.deleteUser(o[1].toString());
					if (status)
					{
						txt_status.setText("erfolgreich gelöscht");
						
						userTree = stools.getUserTree();
					}
					else
					{
						txt_status.setText("Fehler beim löschen");
					}
					
					
				}
			});
```
dass passiert in einer klasse

und folgendes ist die getUserTree methode.....


```
public JTree getUserTree()
	{
		JTree tree;
		try
		{
			DefaultMutableTreeNode root = new DefaultMutableTreeNode("PDF Verwaltung");
			ResultSet users = dbtools.doQuery("SELECT UID from Benutzer WHERE NOT (UID = 'ADMINISTRATOR')");
			while (users.next())
			{
				DefaultMutableTreeNode child = new DefaultMutableTreeNode(users.getString(1));	
				root.add(child);
			}
			tree = new JTree(root);
			tree.setRootVisible(false);

			return tree;
		}
		catch (Exception e)
		{
			log.writeErrorLog(e,"SelectTools.java","getUserTree");
			return null;
		}	
	}
```


----------



## AlArenal (10. Mrz 2006)

Ich sehe keinen Code, wo du versuchst irgendwas am Tree bzw. an dessen Model zu verändern...


----------



## Guest (10. Mrz 2006)

schau mal im button clicked teil


----------



## AlArenal (10. Mrz 2006)

Da änderst du doch nichts am Model, du holst einfach einen neuen JTree.. das gehört ja schonmal ganz verboten auch noch gleich den View auszuwechseln.. da kann sich im UI auch nix ändern. Zum einen ist die Vorgehensweise ein riesengroßes Foobar, zum anderen müsstest du wenn schon auch den neu erzeugte JTree wieder ins UI schieben, denn da hockt dem Code zufolge noch der vorige Tree, mit dem vorigen Model und zeigt dir den alten Stand der Dinge an.

Mich schüttelts..


----------



## Guest (10. Mrz 2006)

und wie solls ichs dann löen ?!

ich find das eigentlich ziemlich einfach so

also den Treeview neu aufzubauen... holt sich ja dann die neuen daten aus der datenbank


----------



## AlArenal (10. Mrz 2006)

Du solltest dir nochmal ein Tutorial oder Buch zum Thema JTree und TreeModel reinziehen, bzw. mal so die Grundlagen von MVC. Ich werde den Teufel tun und dir sagen, wie du nun auf Basis deiner aktuellen Vorgehensweise ne Muckefuck-Lösung hinstrickst, die jedes Mal unnötig Views erzeugt und irgendwelche Repaints und Revalidates erfordert, um von hinten durch die Brust zielgenau ins Auge zu treffen 

Es ist ja auch logischer beim Fernseher den Sender zu wechseln, anstatt sich für jeden Kanal nen neuen Fernseher zu kaufen...

Links in die passende Richtung haben wir hier ja schon zuhauf im Thread.


----------



## Guest (11. Mrz 2006)

ja ok.... je mehr ich drüber nach denk, je mehr muss ich dir (euch) recht geben....


schande dem amateur programmier 

also eigentlich würd es ja reichen, das momentan markierte element aus dem Treeview zu löschen

da gibt es bestimmt ne methode dazu oder?


----------



## Guest (11. Mrz 2006)

Servus,

ich habs jetzt folgendermaßen gelöst......


ist das ok oder aus das auch ne Muckefuck lösung?




  DefaultMutableTreeNode node;
node = (DefaultMutableTreeNode) (userTree.getSelectionPath().getLastPathComponent());
((DefaultTreeModel)userTree.getModel()).removeNodeFromParent(node);


----------



## Beni (11. Mrz 2006)

Die Lösung ist ok, solange du DefaultMutableTreeNodes verwendest. Wenn du was anderes verwendest, wird diese Lösung unbrauchbar.


----------



## Guest (11. Mrz 2006)

Ja ich verwende DefaultMutableTreeNodes

juhuuuuu ich habs geschafft    :bae:  :meld:


----------

