JComponent - ComponentListener - resized / moved

whoopsie

Mitglied
Moin moin!

Ich stehe etwas auf dem Schlauch... ;(

Ein ComponentListener, welcher z. B. zu einem JFrame hinzugefügt wurde, reagiert wunderbar, wenn der JFrame verschoben bzw. in seiner Größe verändert wurde. Leider gibt es einen Haken...

Ändert man die Größe so, dass sich auch die Position des JFrames verändert (z. B. durch das Verkleinern an der oberen linken Ecke des JFrames), so lässt sich während des resized-Ereignisses nur die aktuelle Größe ermitteln, nicht aber die "neue", durch die Größenänderung verursachte, neue Position.

Java:
public class Test extends JFrame {

	public Test() {
		JPanel panel = new JPanel();
		this.setContentPane(panel);
		this.addComponentListener(new ComponentListener() {
			public void componentShown(ComponentEvent e) {}
			public void componentResized(ComponentEvent e) {
				/*
				 * getLocationOnScreen() wird nicht aktualisiert, wenn die Größe 
				 * - an der oberen linken Ecke,
				 * - am oberen Rand
				 * - am linken Rand
				 * verändert wird. Lösung?! 
				 */
				System.out.println(e.getComponent().getLocationOnScreen() + " " + e.getComponent().getSize());
			}
			public void componentMoved(ComponentEvent e) {
				System.out.println(e.getComponent().getLocationOnScreen() + " " + e.getComponent().getSize());
			}			
			public void componentHidden(ComponentEvent e) {}
		});
	}

	public static void main(String[] args) {
		Test test = new Test();
		test.setSize(400,400);
		test.setVisible(true);	
	}

}

Dieses Verhalten der "fehlerhaften" getLocation() führt dazu, dass alle Methoden, welche die "oben links"-, "[0;0]"- bzw. Ursprungsposition benötigen, sei es vom JFrame selber oder von dessen Komponenten, falsche Werte wirft.
Betroffen sind auch prominente Methoden wie die getMouseLocation()...

Sobald der JFrame bewegt wird (ein moved-Ereignis wird geworfen) geben die getLocation()-Methoden wieder korrekte Werte.

Hat jemand eine Lösung oder eine Idee, wie man die fehlerhaften Werte vermeiden kann?

Ciao, :rtfm:
 
Java:
final JFrame f = new JFrame();
f.setSize(300, 300);
f.setLocationRelativeTo(null);
f.setVisible(true);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
f.addComponentListener(new ComponentAdapter() {
	@Override
	public void componentMoved(ComponentEvent e) {
		System.out.println("moved: " + e.getComponent().getLocation());
	}
			
	@Override
	public void componentResized(ComponentEvent e) {
		System.out.println("resized: " + e.getComponent().getSize());
	}
});

Ich kann das Problem mit diesem Code nicht reproduzieren.
 
Versuch mal getBounds().
Das gibt dir einen Rectangle zurück, der das JFrame beschreibt. Bei mir hat das wunderbar funktioniert. Falls das bei dir nicht der Fall ist, kann ich dir morgen ein Beispiel geben. 😉
 
Zuletzt bearbeitet:
Tach,

nun, da Bug Fisher den Fehler nicht reproduzieren konnte und getBounds() natürlich ebenfalls nicht das erhoffte Ergebnis gebracht hat, habe ich genau den Code wie oben angegeben anstatt unter Linux mal unter Windows probiert... siehe da, die Koordinaten werden aktualisiert.

Das Problem liegt (vermutlich) am GTK-Toolkit, welches z. B. von GNOME unter Linux genutzt wird. Dort werden die Koordinaten nicht aktualisiert, wenn ein resized-Ereignis geworfen wird. Erst nach einem moved-Ereignis stimmt wieder alles.

Also, Problem ist gefunden. GTK/GNOME hat ein anderes (fehlerhaftes) Verhalten als Windows. Doof, ist aber so... :shock:

Gruß
 
Zuletzt bearbeitet:
Ich habe o. a. Code ebenfalls unter Unity und XFCE laufen lassen und den Fehler ebenfalls nicht reproduzieren können.
Zu guter letzt habe ich ein anderes System mit GNOME genutzt - ebenfalls kein Fehler.

Der Fehler lag an einer falschen Konfiguration für den X-Server und nicht am GTK-Toolkit oder der Desktopumgebung.

Damit gelöst. Danke.
 
Zuletzt bearbeitet:

Zurück
Oben