GUI Update während der Verarbeitung einer Methode

Status
Nicht offen für weitere Antworten.
M

martin2002

Gast
Hi...

ich habe das problem, dass die grafik nicht aktualisiert wird, wenn ich (component).updateUI() aus einer methode aufrufe (die gerade verarbeitet wird). Ich habe in einem anderen Forum aufgeschnappt, dass das u.a. dann auftritt, wenn ich die betreffende methode aus dem event dispatch thread aufrufe...
In meinem fall mache ich das mit einem ActionListener an einem JMenuItem.
da die grafik wohl auch aus diesem thread heraus aktualisiert wird ist dieser dann belegt und kann das nicht machen...

die frage ist jetzt, wie ich das umgehen bzw. lösen kann? ich habe schon versucht die verarbeitung aus extra threads auszuführen (nach dem beispiel folgender seite: http://www.codecomments.com/archive250-2004-12-335240.html - vorletzter post) -> ging aber auch nicht, da hat sich auch nichts gerührt oder ich hab was falsch gemacht.

so mal noch allgemein um was für ein programm es sich dreht... ich programmiere ein kleines tool zur visualisierung von suchbäumen und den operationen (einfügen, löschen, suchen). die einzelschritte sollen immer angezeigt werden und deshalb muss während dem verarbeiten dieses update gemacht werden... ist ne aufgabe fürn unterricht :wink:

hier mal der programmcode der die löschen-methode aufruft:
Code:
		JMenuItem mnuNodeDel = new JMenuItem("Löschen");
			mnuNodeDel.addActionListener(new ActionListener() {
				public void actionPerformed(ActionEvent arg0) {
					if (_selNode == null) return;
					
					if (JOptionPane.showConfirmDialog(treePane,"Soll der Knoten wirklich gelöscht werden?", "Löschen", JOptionPane.YES_NO_OPTION) == JOptionPane.NO_OPTION) return;
					
					treePane.deleteNode(_selNode); // <-- hier der aufruf
                                        // treePane ist eine extra klasse TreePanel (von JPanel geerbt)... in ihr werden die knoten dargestellt. treePane hat ein null-layout gesetzt.

					treePane.setPreferredSize(new Dimension(350,150));
					getTreePane().setSize(getTreePane().getPreferredSize());
					treePane.updatePosition(treePane.getTreeRoot());					
					treePane.updateUI();
				}				
			});

die methode TreePanel.deleteNode():
Code:
	public void deleteNode(NodeGUI item) {
		NodeGUI tmpNodeL = getTreeRoot().getLChild();
		NodeGUI tmpNodeR = getTreeRoot().getRChild();
		
		if (item.getParentNode() == null) { // delete Root		
			if (tmpNodeL != null)
				tmpNodeL.setParentNode(null);
			if (tmpNodeR != null)
				tmpNodeR.setParentNode(null);
			
			if (actPane != null) {
				actPane.setActionText("Lösche Wurzel");
				actPane.updateUI();
				actPane.txtAction.updateUI();				
						
				if (actPane.isVisu()) {					
					if (tmpNodeL != null)
						tmpNodeL.setRelativeRoot(true);
					if (tmpNodeR != null)
						tmpNodeR.setRelativeRoot(true);
					item.setLChild(null);
					item.setRChild(null);
					
					updateUI();
					paintNodeLines(getGraphics(), getTreeRoot());
					paintNodeLines(getGraphics(), tmpNodeL);
					paintNodeLines(getGraphics(), tmpNodeR);
					
					long now = System.currentTimeMillis();
					while (System.currentTimeMillis() <= now+1000) continue;
				}
			}
			
			if (tmpNodeL == null) {				
				if (actPane != null && actPane.isVisu() && tmpNodeR != null) {
					remove(getTreeRoot());
					tmpNodeR.setRelativeRoot(false);
					updatePosition(tmpNodeR,true);
					updateUI();
					paintNodeLines(getGraphics(), tmpNodeR);
					
					long now = System.currentTimeMillis();
					while (System.currentTimeMillis() <= now+1000) continue;
				}
				
				setTreeRoot(tmpNodeR);
			} else {
				if (actPane != null && actPane.isVisu()) {
					remove(getTreeRoot());
					tmpNodeL.setRelativeRoot(false);
					updatePosition(tmpNodeL,true);
					updateUI();
					paintNodeLines(getGraphics(), tmpNodeR);
					
					long now = System.currentTimeMillis();
					while (System.currentTimeMillis() <= now+1000) continue;
				}
				
				setTreeRoot(addNode(getTreeRoot(), item.getRChild()));				
			}			
		} else {
			if (actPane != null) {
				actPane.setActionText("Löschen:\n\nHerauslösen des Elements '"+item.getText()+"'");
				actPane.updateUI();
				actPane.txtAction.updateUI();
			}
			
			if (item.getParentNode().getLChild() == item) {
				item.getParentNode().setLChild(null);
			} else if (item.getParentNode().getRChild() == item) {
				item.getParentNode().setRChild(null);
			}
			item.setParentNode(null);

			if (actPane != null && actPane.isVisu()) {			
				updateUI();
				item.setRelativeRoot(true);
				paintNodeLines(getGraphics(), getTreeRoot());
				paintNodeLines(getGraphics(), item);
				
				long now = System.currentTimeMillis();
				while (System.currentTimeMillis() <= now+1000) continue;
			}
			
			if (item.getLChild() != null) {
				if (actPane != null) {
					actPane.setActionText("Löschen:\n\nWiedereinfügen des linken Nachfolgers");
					actPane.updateUI();
					actPane.txtAction.updateUI();
					
					if (actPane.isVisu()) {
						item.getLChild().setActive(true);
						long now = System.currentTimeMillis();
						while (System.currentTimeMillis() <= now+1000) continue;
					}
				}				
				setTreeRoot(addNode(getTreeRoot(), item.getLChild()));
				
				if (actPane != null && actPane.isVisu()) {
					item.getLChild().setActive(false);
				}
			}
						
			if (item.getRChild() != null) {
				if (actPane != null) {
					actPane.setActionText("Löschen:\n\nWiedereinfügen des rechten Nachfolgers");
					actPane.updateUI();
					actPane.txtAction.updateUI();
					
					if (actPane.isVisu()) {
						item.getRChild().setActive(true);
						long now = System.currentTimeMillis();
						while (System.currentTimeMillis() <= now+1000) continue;
					}
				}				
				setTreeRoot(addNode(getTreeRoot(), item.getRChild()));

				if (actPane != null && actPane.isVisu()) {
					item.getRChild().setActive(false);
				}				
			}
		}
		
		this.remove(item);
		item = null;		
	}

der code der in die blöcke "if (actPane.isVisu())" eingeschlossen ist soll die grafikupdates auslösen, nachdem er verschiedenes vorbereitet hat...


ich wär euch echt dankbar, wenn ihr mir damit schnell helfen könntet

thx
martin
 

Craven

Aktives Mitglied
Ohne das ich mir jetzt den ganzen Quellcode reinziehe! Hast Du schon ein "repaint()" probiert?!

Grüße

Craven
 

8ull23y3

Bekanntes Mitglied
Den Code habe ich mir zugegeben auch nicht durchgelesen aber solange es Swing ist kannste in ! auch in ner Methode ! folgendes probieren:

Code:
SwingUtilities.updateComopnentTreeUI;

hoffe das konnte dir was helfen ;)
 
B

Beni

Gast
1. updateUI, oder updateComponentTreeUI, sorgt für ein Neusetzen des LookAndFeels (Es gibt nicht mehr viele Operationen, welche noch mehr Ressourcen benötigen...). Willst du wirklich das LookAndFeel neu setzen? So wie ich deinen Code verstehe, gehts um was anderes.

2. Bäume kann man auch ganz gut mit JTree darstellen, ist vielleicht einfacher :wink:

3. Zeichnen sollte man immer und ausschliesslich in einer Methode die "paint( Graphics g )" überschreibt, oder von paint aufgerufen wird. Dieses "getGraphics" gehört verboten (dein Problem kommt auch davon, dass dieses Graphics-Objekt nach einer gewissen Zeit einfach keinen Einfluss mehr hat).

4. Also: IMHO würd ich den Code total umschreiben. In der paint-Methode würd ich den Baum zeichnen, beim löschen eines Knotens lediglich die Datenstruktur "Tree" verändern, und dann repaint aufrufen. (Dadurch verzögert sich die Darstellung um 2 Millisekunden, das ist nicht weiter schlimm :wink: )
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
D JTable während edit kein update machen lassen AWT, Swing, JavaFX & SWT 2
T ProgressBox - Update AWT, Swing, JavaFX & SWT 9
Ernesto95 JavaFX JavaFX GUI mit sehr vielen Update requests AWT, Swing, JavaFX & SWT 4
G update, paintComponent AWT, Swing, JavaFX & SWT 1
T GUI Update /EDT AWT, Swing, JavaFX & SWT 7
izoards JavaFX Concurrency Update UI AWT, Swing, JavaFX & SWT 35
ms_cikar Update swingUtilities Repaint in der Schleife AWT, Swing, JavaFX & SWT 3
J TableView Update/Refresh CPU AWT, Swing, JavaFX & SWT 2
A Verständnisfragen im Umgang mit update() und JFrames AWT, Swing, JavaFX & SWT 5
ralfb1105 Swing JComboBox update der Daten AWT, Swing, JavaFX & SWT 8
blazingblade JavaFX Tableview Clock Column update AWT, Swing, JavaFX & SWT 5
R Update eines Labels bei Methodenaufruf einer anderen Klasse AWT, Swing, JavaFX & SWT 9
B Swing Update Swing Komponente bevor Methode startet. AWT, Swing, JavaFX & SWT 4
M JavaFX ComboBox: Update zur Laufzeit AWT, Swing, JavaFX & SWT 16
W Swing ProgressBar update AWT, Swing, JavaFX & SWT 4
B IconImage update im Tabbedpane AWT, Swing, JavaFX & SWT 3
M Update überschreiben klappt nicht AWT, Swing, JavaFX & SWT 4
Q JList Update Problem AWT, Swing, JavaFX & SWT 1
N Observer: update ruft nicht repaint auf AWT, Swing, JavaFX & SWT 0
M "Update" der JTable funktioniert nicht AWT, Swing, JavaFX & SWT 2
S Swing Update eine JTabelle nach einer Drag&Drop Operation AWT, Swing, JavaFX & SWT 0
C Swing Update von swing-TableModels per Thread. Eins geht, das andere nicht, warum? AWT, Swing, JavaFX & SWT 12
V Swing Update Textarea AWT, Swing, JavaFX & SWT 2
T Event Handling JFreeChart Update AWT, Swing, JavaFX & SWT 2
Farbtopf Live update JFreeChart AWT, Swing, JavaFX & SWT 3
F Swing GUI-Thread für automatisches Update nutzen AWT, Swing, JavaFX & SWT 10
El_Lobo Swing bei Update von Graphik Koordinatensystem nicht jedesmal neu zeichnen AWT, Swing, JavaFX & SWT 2
M Update JPanel AWT, Swing, JavaFX & SWT 12
N update model nach dem filtern AWT, Swing, JavaFX & SWT 2
E Umgang mit der Update Methode AWT, Swing, JavaFX & SWT 38
E Swing Update JTable AWT, Swing, JavaFX & SWT 6
L Update JTree Verzeichnisse AWT, Swing, JavaFX & SWT 9
G Swing Update-Funktion für Swing-Anwendung AWT, Swing, JavaFX & SWT 5
E Swing JTextField Listener nach Update?! AWT, Swing, JavaFX & SWT 2
D Swing JTable Problem bei automatischem update von Zellen AWT, Swing, JavaFX & SWT 3
P 2D-Grafik PaintComponent() übernimmt keine Werte aus update() AWT, Swing, JavaFX & SWT 8
D Swing update eines Labels nicht sichtbar AWT, Swing, JavaFX & SWT 9
N Tablle nach SQL-Update neu Laden AWT, Swing, JavaFX & SWT 4
M SWT grabExcessHorizontalSpace update ? refresh ? AWT, Swing, JavaFX & SWT 6
P Observer und GUI Update AWT, Swing, JavaFX & SWT 2
w0ddes Swing Update: Laufendes GUI updaten AWT, Swing, JavaFX & SWT 8
M Swing Kein update bei simulierten HTML-Link AWT, Swing, JavaFX & SWT 4
C SWT Shell update probleme - Mausbewegung nötig AWT, Swing, JavaFX & SWT 2
hdi Swing GUI update vs. Process Speed AWT, Swing, JavaFX & SWT 31
hdi Swing Gui Update Problem (EDT) AWT, Swing, JavaFX & SWT 6
C JList update über tabbedPane? AWT, Swing, JavaFX & SWT 18
M Update einer JTEextArea AWT, Swing, JavaFX & SWT 2
H JTable mySQL Update AWT, Swing, JavaFX & SWT 8
S Update des fensters beim Ersetzen von JPanels AWT, Swing, JavaFX & SWT 9
G Features nach Update löschen AWT, Swing, JavaFX & SWT 2
J Fragen zur Vererbung und Update AWT, Swing, JavaFX & SWT 12
B Update von JLabels AWT, Swing, JavaFX & SWT 2
C Habe Probleme beim Bild laden! *Update 30.11.2006* AWT, Swing, JavaFX & SWT 28
C JTreeTable update Problem AWT, Swing, JavaFX & SWT 4
S Probleme mit dem Update einer JList AWT, Swing, JavaFX & SWT 7
B View zeichnet Daten aus dem Model ohne Update AWT, Swing, JavaFX & SWT 4
A Update von Frameinhalt und Scrollbar AWT, Swing, JavaFX & SWT 11
F MVC: Update von View und Controller AWT, Swing, JavaFX & SWT 5
C JTable update: Selektion beibehalten AWT, Swing, JavaFX & SWT 12
P paintComponent /paint/ update/ offscreenImage / Graphics2D / AWT, Swing, JavaFX & SWT 4
S JMenuBar + update AWT, Swing, JavaFX & SWT 3
G JTree - ungültiger selection update AWT, Swing, JavaFX & SWT 2
G Problem mit JLabel Update AWT, Swing, JavaFX & SWT 3
C [JTable] Update der Datenbank AWT, Swing, JavaFX & SWT 6
N update()-Methode für Canvas AWT, Swing, JavaFX & SWT 9
A problem mit update nach event, JSplitpane spinnt AWT, Swing, JavaFX & SWT 2
S Update von Grafik auf JPanel AWT, Swing, JavaFX & SWT 2
M update JTable AWT, Swing, JavaFX & SWT 3
T Problem bei Update von JTables in JTabbedPane AWT, Swing, JavaFX & SWT 2
D Problem beim Update von unsichtbaren JComponents mit Timern AWT, Swing, JavaFX & SWT 5
D Swing: GUI-Update-Problem AWT, Swing, JavaFX & SWT 3
J Warum funktioniert das Update des UI nicht? AWT, Swing, JavaFX & SWT 8
I GUI-Update-Probleme AWT, Swing, JavaFX & SWT 2
G Update von JPanel nach Buttonbetätigung AWT, Swing, JavaFX & SWT 1
H JItem während der Programmlaufzeit verändern AWT, Swing, JavaFX & SWT 8
G JavaFX BarChart während der Runtime aktualisieren AWT, Swing, JavaFX & SWT 4
E Swing Layout während der Laufzeit anpassen AWT, Swing, JavaFX & SWT 3
S JavaFX ListView Inhalte während Laufzeit ändern AWT, Swing, JavaFX & SWT 23
I AWT Listener während man in anderem Fenster ist AWT, Swing, JavaFX & SWT 4
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
G JavaFX - Während AudioRecording keine Text eingabe TextField möglich AWT, Swing, JavaFX & SWT 6
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
T Timer und GIF Animationen pausieren während Maus sich bewegt AWT, Swing, JavaFX & SWT 4
N JLabel ändern während Programm ausgeführt wird AWT, Swing, JavaFX & SWT 4
U Java FX Zusätzliches Label per Knopfdruck während der Laufzeit auf Panel einfügen. AWT, Swing, JavaFX & SWT 2
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
B 3D-Grafik Java 3D Licht während Laufzeit ändern AWT, Swing, JavaFX & SWT 0
Joew0815 Dropdown meue während der Laufzeit ändern. AWT, Swing, JavaFX & SWT 6
D Swing Jlist Größe während der Laufzeit verändern. AWT, Swing, JavaFX & SWT 11
J JLabel während einer methode aktualisieren AWT, Swing, JavaFX & SWT 6
H jprogressbar während datenabfrage anzeigen AWT, Swing, JavaFX & SWT 5
B ProgressBar während Berechnung AWT, Swing, JavaFX & SWT 4
M Swing JList Item in andere JList während Ausführung AWT, Swing, JavaFX & SWT 4
M JLabel aktualsisieren während Verarbeitung AWT, Swing, JavaFX & SWT 12
E Buttons während einer Berechnung deaktivieren AWT, Swing, JavaFX & SWT 6
D JTable Mausevents, während editiert wird AWT, Swing, JavaFX & SWT 5
T Swing JFrame blockieren während anderes JFrame offen ist AWT, Swing, JavaFX & SWT 2
R Wie Vorgehen bei fundamentaler Veränderung des Layouts während des Programmablaufs? AWT, Swing, JavaFX & SWT 19
S Programm pausieren während JDialog offen ist AWT, Swing, JavaFX & SWT 2
X Tabelle während Funktionsaufruf aktualisieren AWT, Swing, JavaFX & SWT 11

Ähnliche Java Themen

Neue Themen


Oben