Swing Oberfläche rekusiv updaten mit updateUi()

SignIn

Mitglied
Hallo zusammen,

ich habe eine Oberfläche, die sich beim ändern des Models rekursiv updatet. Dazu habe ich eine View mit der Funktion update()

Java:
[...]

public void update ()
	{
		//Oberfläche updaten
		updateChilds (_mainpanel);
	}
	
	public void updateChilds (Component comp)
	{
		
		if (comp == null) return;
		if (comp instanceof Container)
		{
			Container con = (Container) comp;
			Component[] comps = con.getComponents();
			for (int i = 0; i<comps.length; i++)
			{
				Component c = comps[i];
				if (c instanceof JComponent) {
					JComponent jc = (JComponent)comp;
					jc.updateUI();
				}
				updateChilds(c);
			}
			return;
			
		}

Dabei bekomme ich einen Fehler:

Code:
Exception in thread "AWT-EventQueue-0" java.lang.ArrayIndexOutOfBoundsException: 0
	at javax.swing.plaf.basic.BasicTabbedPaneUI.tabForCoordinate(BasicTabbedPaneUI.java:1506)
	at javax.swing.plaf.basic.BasicTabbedPaneUI.setRolloverTab(BasicTabbedPaneUI.java:575)
	at javax.swing.plaf.basic.BasicTabbedPaneUI.access$2000(BasicTabbedPaneUI.java:54)
	at javax.swing.plaf.basic.BasicTabbedPaneUI$Handler.mouseEntered(BasicTabbedPaneUI.java:3627)
	at java.awt.Component.processMouseEvent(Component.java:6534)
	at javax.swing.JComponent.processMouseEvent(JComponent.java:3321)
	at java.awt.Component.processEvent(Component.java:6290)
	at java.awt.Container.processEvent(Container.java:2234)
	at java.awt.Component.dispatchEventImpl(Component.java:4881)
	at java.awt.Container.dispatchEventImpl(Container.java:2292)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4898)
	at java.awt.LightweightDispatcher.retargetMouseEnterExit(Container.java:4686)
	at java.awt.LightweightDispatcher.trackMouseEnterExit(Container.java:4665)
	at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4514)
	at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4462)
	at java.awt.Container.dispatchEventImpl(Container.java:2278)
	at java.awt.Window.dispatchEventImpl(Window.java:2739)
	at java.awt.Component.dispatchEvent(Component.java:4703)
	at java.awt.EventQueue.dispatchEventImpl(EventQueue.java:746)
	at java.awt.EventQueue.access$400(EventQueue.java:97)
	at java.awt.EventQueue$3.run(EventQueue.java:697)
	at java.awt.EventQueue$3.run(EventQueue.java:691)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:86)
	at java.awt.EventQueue$4.run(EventQueue.java:719)
	at java.awt.EventQueue$4.run(EventQueue.java:717)
	at java.security.AccessController.doPrivileged(Native Method)
	at java.security.ProtectionDomain$1.doIntersectionPrivilege(ProtectionDomain.java:75)
	at java.awt.EventQueue.dispatchEvent(EventQueue.java:716)
	at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:201)
	at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:116)
	at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:105)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:101)
	at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:93)
	at java.awt.EventDispatchThread.run(EventDispatchThread.java:82)

Dann wollte ich debuggen, und mein Eclipse stürzt ab und der Bildschirm friert ein. Also hab ich die Updatefunktion mal herausgenommen und ein return rein mit einem Haltepunkt versehen:

Java:
public void update ()
	{
	//also hier passiert eigentlich nichts, trotzdem friert der Bildschirm ein, aber nur im Debugmodus
		return;
}

Hat jemand eine Idee, woran das liegen könnte ?

Vielen Dank !

SignIn
 

Gucky

Top Contributor
Das er nur im Debugmodus einfriert, hört sich nach einer Race Condition an. Wie viele Threads verwendest du?

Welchen Teil aus diesem StackTrace hast du selber geschrieben?
 

SignIn

Mitglied
Hallo Gucky,

danke für die Hilfe. Also ich verwende keine Threads. Und keine der genannten Dateien in der Fehlermeldung habe ich erstellt ....

Ehrlich gesagt, musste ich jetzt erstma Race Condition nachschlagen ....
 

Gucky

Top Contributor
Ach so. Ein Anfänger. Sorry ;)

Das ist natürlich ein interessantes Problem.
Poste mal den ganzen Code. So kann ich nichts sagen.
 

SignIn

Mitglied
Auweia, der ganze Code ist so umfangreich. Da hängt eine Datenbank dran und ich hab ein eigenes MVC versucht zu schreiben, dementsprechend viele Klassen sind das mittlerweile. Bis dato hatte auch alles funktioniert, nur lassen sich die Tabellen auf der Oberfläche nicht updaten. Für die Tabellen habe ich ein TableModel, was meine Modelklasse enthält und sich daraus die Daten zieht.

Aus einer Combobox wird ein Objekt gewählt und das Model läd die neuen Daten. Danach wollte ich die Tabellen updaten. revalidate, repaint etc. funktionieren nicht.

Vielleicht hab ich wirklich einen Denkfehler in der Zeitabfolge ...... ich denke nochmal nach ...
 

SignIn

Mitglied
Ok, ich versuch mal das wichtigste hierrein zu kopieren.
Also ich habe ein MainFrame was das Interface IView und IObserver implementiert. Hat eine update()-Methode, die die aktuelle Oberfläche updaten soll.
Ich habe aso eine ComboBox in der ein Lagerort ausgewählt werden kann. Das klappt soweit. Wenn jetzt ein anderes Item gewählt wird, wird der TableConnectController aufgerufen und die neuen Daten werden geladen.
Wenn das Laden fertig ist, wird _model.hasChanged() aufgerufen, welches die Observer benachrichtigt, sich upzudaten.

So, nun zum Quelltext:

Model:
Java:
[...]
	public void hasChanged ()
	{
		if (_observer == null) return;
		Iterator<IObserver> it = _observer.iterator();
		while (it.hasNext())
		{
			it.next().update();
		}
	}
[...]

View = Observer
Java:
	public void updateChilds (Component comp)
	{
		
		if (comp == null) return;
		
		if (comp instanceof JScrollPane) {
			Component compo = ((JScrollPane)comp).getViewport().getView();
			if (compo instanceof JTable) {
				JTable tab = ((JTable)compo);
				tab.updateUI();
			}
			return;
		}
		
		if (comp instanceof Container)
		{
			Container con = (Container) comp;
			Component[] comps = con.getComponents();
			if (comps == null) return;
			int anzahl = comps.length;
			
			for (int i = 0; i<anzahl; i++)
			{
				Component c = comps[i];
				/*if (c instanceof JComponent) {
					JComponent jc = (JComponent)comp;
					//jc.repaint();
					
				}*/
				if (c instanceof JTable) continue;
				updateChilds(c);
				
			}
			
		}
	}

Controller erbt von ActionListener
Java:
@Override
	public void actionPerformed(ActionEvent ev) {
		// TODO Auto-generated method stub
		if (_art == Art.LAGERORTE)
		{
			if (ev.getSource() instanceof JComboBox)
			{
				JComboBox<IMObject> combo = (JComboBox<IMObject>)ev.getSource();
				if (combo.getSelectedItem() instanceof MLagerort)
				{
					MLagerort ort = (MLagerort) combo.getSelectedItem();
					ort.loadSubs(_model.getDatabase(), MLagerort.Subs.GERAETE);
					ort.loadSubs(_model.getDatabase(), MLagerort.Subs.CHEMIKALIEN);
					_model.hasChanged();
				}
					
			}
		}
 

Gucky

Top Contributor
Kannst du versuchen ein KSKB zu erstellen, dass den Fehler enthält?

Versuch mal Zeilen nach einander auszukommentieren und versuche so den Fehler einzugrenzen.
 

SignIn

Mitglied
Tut mir leid. Kam heute erst wieder dazu, was zu machen.

Ich habe jetzt diesen merkwürdigen Absturz versucht auf die Schliche zu kommen.

Der Debugger stürzt beim Aufruf der actionPerformed - Methode ab.
Auch wenn diese Methode scheinbr lehr ist (nur ein System.out.println um einen Haltepunkt zu setzen) ... fand ich sehr komisch. Also hab ich mal versucht meiner Combobox ein Objekt einer Klasse mit addActionListener hinzuzufügen, die direkt von ActionListener erbt und siehe da, es funktioniert und nichts friert ein.

Bisher habe ich von IController abgeleitet, welcher wiederum von ActionListener erbt.

Java:
package controller;

import model.IModel;

import java.awt.event.ActionListener;
import java.awt.event.ActionEvent;

import view.IView;

public interface IController extends ActionListener {
	public IModel getModel ();
	public void actionPerformed (ActionEvent ev);
	public void setModel (IModel model);
	public void setView (IView view);
	public void error (Exception ex, String ustr);
	public void message();
}

Anwendung:
Java:
		LagerortComboBoxController ctrl = new LagerortComboBoxController ();
		combo.addActionListener(ctrl);

LagerortComboBoxController erbte einmal direkt von ActionListener und einmal von IController. Bis letzterem friert am Haltepunkt der Bildschirm ein.
Das witzige ist, dass ich IController schon im Zusammenhang mit einer ComboBox verwendet habe und da geht es :noe:

Jemand eine Idee ? Was mache ich da falsch ? Ich nutze Java 8.

Viele Grüße, SignIn
 

SignIn

Mitglied
Hab mich jetzt dazu entschlossen, doch nur die Tabellen auf der Oberfläche upzudaten, wenn sich was am Model ändert, weil ich eigentlich keine anderen Anzeigen derzeit habe. Und das funktioniert jetzt ...

Hier der Code der UpdateChild-Methode:

Java:
public void updateChilds (Component comp)
	{
		
		if (comp == null) return;
		if (comp instanceof JTable) {
			JTable tab = (JTable) comp;
			TableModel mod = tab.getModel();
			if (mod instanceof ITableModel) ((ITableModel) mod).modelChanged();
			tab.updateUI();
			return;
		}
		
		if (comp instanceof Container)
		{
			Component[] comps = ((Container)comp).getComponents();
			if (comps == null || comps.length == 0) return;
			for (int i=0;i<comps.length;i++) updateChilds(comps[i]);
		}
	}
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
N Wie kann ich zwei Grafiken in einer Oberfläche anzeigen lassen? AWT, Swing, JavaFX & SWT 8
D Objekte einer Oberfläche in eine Datei/Ordner speichern AWT, Swing, JavaFX & SWT 9
A Oberfläche mit zwei Klassen und actionlistener verbinden AWT, Swing, JavaFX & SWT 7
M LookAndFeel Oberfläche wie Eclipse/Business Objects oder Solvatio AWT, Swing, JavaFX & SWT 2
K Initialisierung von Oberfläche Richtig? AWT, Swing, JavaFX & SWT 5
T Java Swing Oberfläche aktualisiert sich nicht AWT, Swing, JavaFX & SWT 2
K Eclipse-Java Export/Import mit Oberfläche AWT, Swing, JavaFX & SWT 2
D Swing JComponent zeichnen ohne sie zur Oberfläche hinzuzufügen AWT, Swing, JavaFX & SWT 2
J prinzipielles verständnis für Oberfläche/Code-trennung AWT, Swing, JavaFX & SWT 5
T wieso leere Oberfläche? AWT, Swing, JavaFX & SWT 5
S Flickr Bilder in Gui Oberfläche AWT, Swing, JavaFX & SWT 21
cedi Swing Problem mit Grafischer Oberfläche AWT, Swing, JavaFX & SWT 8
E Swing Grafische Oberfläche zur Ordnerauswahl AWT, Swing, JavaFX & SWT 6
Z Component für File-Browser ähnliche Oberfläche AWT, Swing, JavaFX & SWT 6
B Wegfindung - Oberfläche AWT, Swing, JavaFX & SWT 3
P Erste Versuche einer Grafischen Oberfläche AWT, Swing, JavaFX & SWT 8
S AWT Oberfläche integriert sich nicht in GTK-Theme AWT, Swing, JavaFX & SWT 5
Private Void Swing "Vier Gewinnt"-Oberfläche AWT, Swing, JavaFX & SWT 7
L Eigene Design Oberfläche erstellen AWT, Swing, JavaFX & SWT 3
D Mehrere Biler auf einer Oberfläche AWT, Swing, JavaFX & SWT 6
G Swing skalierbare Oberfläche AWT, Swing, JavaFX & SWT 2
W Oberfläche wird nicht koreckt gezeichnet AWT, Swing, JavaFX & SWT 5
Jenny87 AWT Tic Tac Toe oberfläche AWT, Swing, JavaFX & SWT 20
dl85hej meine erste Oberfläche AWT, Swing, JavaFX & SWT 3
multiholle Oberfläche MP3-Player AWT, Swing, JavaFX & SWT 2
A Oberfläche wir mit html-Frames aufbauen AWT, Swing, JavaFX & SWT 11
C Swing-Oberfläche wird auf einiges PCs nicht korrekt dargeste AWT, Swing, JavaFX & SWT 19
H JAVA Fenster Oberfläche AWT, Swing, JavaFX & SWT 3
L wie kann ich diese Oberfläche bauen ohne das gestreckt wird? AWT, Swing, JavaFX & SWT 18
S In JavaSwing Mailversand mit Oberfläche AWT, Swing, JavaFX & SWT 2
F Wie Oberfläche verbessern? (JButtons, Textfeld verkleinern) AWT, Swing, JavaFX & SWT 5
M Aus Swing Oberfläche Bild erzeugen AWT, Swing, JavaFX & SWT 39
F Zugriff auf Oberfläche bzw Trennung GUI / Logik AWT, Swing, JavaFX & SWT 3
T Problem mit Oberfläche und Thread AWT, Swing, JavaFX & SWT 10
G Ansprechende Java Oberfläche entwickeln AWT, Swing, JavaFX & SWT 10
B Probleme mit Öffnen einer GUI Oberfläche AWT, Swing, JavaFX & SWT 2
I Swing-Oberfläche wird nicht korrekt gezeichnet AWT, Swing, JavaFX & SWT 6
G Oberfläche löschen und neue erstellen AWT, Swing, JavaFX & SWT 4
R RAD Oberfläche für Eclipse gesucht AWT, Swing, JavaFX & SWT 4
G Tooltips auf grafischer Oberfläche AWT, Swing, JavaFX & SWT 2
A Background Image auf SWT Oberfläche legen AWT, Swing, JavaFX & SWT 3
J Anordung der Objekte in der Oberfläche? AWT, Swing, JavaFX & SWT 3
B Oberfläche mit SWT AWT, Swing, JavaFX & SWT 5
S Berechtigungssystem für Swing-Oberfläche AWT, Swing, JavaFX & SWT 2
M Grafische Objekte beliebig auf einer Oberfläche verschieben AWT, Swing, JavaFX & SWT 3
T Eigene grafische Oberfläche AWT, Swing, JavaFX & SWT 7
G JTree in Oberfläche Integrieren?? AWT, Swing, JavaFX & SWT 6
D Trennung von Programm und Oberfläche AWT, Swing, JavaFX & SWT 3
M Java Oberfläche per Drag&Drop -- Wie bei Visual Basic ! AWT, Swing, JavaFX & SWT 5
F Oberfläche wird nicht gestartet! AWT, Swing, JavaFX & SWT 2
L Label im JavaFX Thread Updaten AWT, Swing, JavaFX & SWT 3
ralfb1105 JavaFX Label lässt sich innerhalb service Task nicht updaten? AWT, Swing, JavaFX & SWT 22
it_is_all ActionListener umlenken/ updaten mit AddActionListener funktioniert nicht AWT, Swing, JavaFX & SWT 3
0 Swing JTable aus anderer Klasse updaten AWT, Swing, JavaFX & SWT 5
T JProgressbar während actionListener updaten AWT, Swing, JavaFX & SWT 1
N JavaFX TextArea Updaten bevor Prozess gestartet wird AWT, Swing, JavaFX & SWT 7
I JavaFX Im Controller die ProgressBar mit Task updaten AWT, Swing, JavaFX & SWT 6
K Swing JTable updaten AWT, Swing, JavaFX & SWT 9
A Swing JMenuBar updaten AWT, Swing, JavaFX & SWT 2
J JTree updaten AWT, Swing, JavaFX & SWT 2
N JTable updaten AWT, Swing, JavaFX & SWT 2
M GUI muss updaten und neuzeichnen AWT, Swing, JavaFX & SWT 3
Q GUI außerhalb GUI-Thread updaten - GUI friert ein AWT, Swing, JavaFX & SWT 18
Q Swing Fenster updaten - Hinzugefügte Komponenten darstellen AWT, Swing, JavaFX & SWT 3
K JLists mit Fileobjekten updaten AWT, Swing, JavaFX & SWT 2
L JTextField updaten AWT, Swing, JavaFX & SWT 2
E Swing JProgressBar updaten AWT, Swing, JavaFX & SWT 3
M PropertyChangeListener - JTable bei neuen Objekten updaten? AWT, Swing, JavaFX & SWT 3
A JProgressBar updaten abhängig vom Output eines externen Skripts AWT, Swing, JavaFX & SWT 2
S Würfelanimation icon updaten AWT, Swing, JavaFX & SWT 8
R Swing Tabellen updaten AWT, Swing, JavaFX & SWT 10
L JTable aus MySQL DB updaten - Live AWT, Swing, JavaFX & SWT 7
Burny91 Swing Mit Timer JLabel updaten AWT, Swing, JavaFX & SWT 2
N Swing GUI updaten / Aufklappbare Jpanels AWT, Swing, JavaFX & SWT 2
w0ddes Swing Update: Laufendes GUI updaten AWT, Swing, JavaFX & SWT 8
Z Swing Komponenten updaten AWT, Swing, JavaFX & SWT 4
X SWT - Text von Text-Komponenten updaten (wie?) AWT, Swing, JavaFX & SWT 4
G JFreeChart und das updaten AWT, Swing, JavaFX & SWT 7
K Tabelle nach JOptionPane updaten AWT, Swing, JavaFX & SWT 5
J [JTree] Node updaten AWT, Swing, JavaFX & SWT 3
G Ein jTextField im laufe das Programmes immer wieder updaten AWT, Swing, JavaFX & SWT 2
QDog JComboBox updaten, ArrayList AWT, Swing, JavaFX & SWT 7
G JTextField von andere classe updaten AWT, Swing, JavaFX & SWT 11
P GUI-Updaten während eines externen Prozesses AWT, Swing, JavaFX & SWT 2
G JTable aus Thread heraus updaten AWT, Swing, JavaFX & SWT 3
P Components updaten AWT, Swing, JavaFX & SWT 2
P JTable (->Datenbank) editieren/updaten AWT, Swing, JavaFX & SWT 3
R Componenten eines JFrames updaten AWT, Swing, JavaFX & SWT 11
R Menubar immer updaten! AWT, Swing, JavaFX & SWT 9
X textarea updaten bevor eine Methode aufegerufen wird AWT, Swing, JavaFX & SWT 6
C Text in JTextArea bei mouseEntered() updaten AWT, Swing, JavaFX & SWT 2
C JFrame updaten! AWT, Swing, JavaFX & SWT 2
J JFrame mit Zeigeruhr updaten AWT, Swing, JavaFX & SWT 16
P SWT table updaten AWT, Swing, JavaFX & SWT 7
C Textarea kontinuerlich updaten AWT, Swing, JavaFX & SWT 3
M Probleme mit dem Updaten von graphischen Komponenten AWT, Swing, JavaFX & SWT 2
M JTree updaten AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben