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:
 

Bug Fisher

Bekanntes Mitglied
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.
 

Gucky

Top Contributor
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:

whoopsie

Mitglied
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:

whoopsie

Mitglied
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:
Ähnliche Java Themen
  Titel Forum Antworten Datum
B Batik: Inhalt JComponent to SVG? AWT, Swing, JavaFX & SWT 6
Hatsi09 JComponent anklicken und "entklicken" AWT, Swing, JavaFX & SWT 7
L JComponent aus JPanel anhand Mausposition ermitteln AWT, Swing, JavaFX & SWT 10
S Swing Schwierigkeiten mit JComponent AWT, Swing, JavaFX & SWT 4
T Swing JComponent vergrößern AWT, Swing, JavaFX & SWT 4
L JComponent und MouseMotionListener AWT, Swing, JavaFX & SWT 2
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L Eigene JComponent in GridLayout AWT, Swing, JavaFX & SWT 9
Z JComponent's requestFocus() - Wieso nicht immer anwendbar? AWT, Swing, JavaFX & SWT 1
Z Java-Swing : JComponent AWT, Swing, JavaFX & SWT 2
Developer_X Wie heißt das JComponent hier? AWT, Swing, JavaFX & SWT 2
A Swing Eigene JComponent Scrollable AWT, Swing, JavaFX & SWT 6
R JComponent auf Canvas AWT, Swing, JavaFX & SWT 8
A Abgeleitete JComponent wird nicht gezeichnet AWT, Swing, JavaFX & SWT 10
A JComponent Größe AWT, Swing, JavaFX & SWT 8
T jcomponent wird nicht angezeigt AWT, Swing, JavaFX & SWT 9
S Eigene JComponent Image zeichnen AWT, Swing, JavaFX & SWT 3
H Swing "Drag and Drop" eines JComponent über ein JPanel AWT, Swing, JavaFX & SWT 2
N 2D-Grafik RTF in eigener JComponent AWT, Swing, JavaFX & SWT 2
D Swing JComponent zeichnen ohne sie zur Oberfläche hinzuzufügen AWT, Swing, JavaFX & SWT 2
P JComponent / JLabel drehen (Rotation) AWT, Swing, JavaFX & SWT 2
D JComponent erweitern AWT, Swing, JavaFX & SWT 4
1 JComponent -> java.lang.NullPointerException AWT, Swing, JavaFX & SWT 13
M 2x JComponent in einem JFrame darstellen? AWT, Swing, JavaFX & SWT 7
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
P Swing Eigene Komponente Entwickeln - erben von JComponent oder JPanel? AWT, Swing, JavaFX & SWT 5
B Wechsel JTextArea und JComponent AWT, Swing, JavaFX & SWT 9
S Unterscheiden ob ein Graphics-Objekt von einer JComponent oder einem BufferedImage kommt..? AWT, Swing, JavaFX & SWT 4
H JComponent == JTextfield? AWT, Swing, JavaFX & SWT 4
C Ermitteln ob JComponent einen Listener besitzt AWT, Swing, JavaFX & SWT 2
T Eigene JComponent AWT, Swing, JavaFX & SWT 4
G JComponent nachträglich in JPanel einfügen AWT, Swing, JavaFX & SWT 5
M Ganzen Frame mit JComponent ausfüllen AWT, Swing, JavaFX & SWT 9
M JMenu teilweise unter einer JComponent AWT, Swing, JavaFX & SWT 4
I Swing JComponent als BufferedImage speichern AWT, Swing, JavaFX & SWT 18
1 Eigene JComponent mit MouseListener versehen AWT, Swing, JavaFX & SWT 10
T JComponent nur in Swing verwendbar? AWT, Swing, JavaFX & SWT 6
M Mehrere Icons in einer JComponent AWT, Swing, JavaFX & SWT 5
Dragonfire Image von JComponent AWT, Swing, JavaFX & SWT 2
T x und y herrausfinden eines JComponent auf JFrame AWT, Swing, JavaFX & SWT 14
J absolute Position einer JComponent ermitteln AWT, Swing, JavaFX & SWT 4
B "weiches" Bewegen von einem JComponent AWT, Swing, JavaFX & SWT 18
ARadauer JPanel vs JComponent AWT, Swing, JavaFX & SWT 2
I JDialog aus JComponent erstellen AWT, Swing, JavaFX & SWT 2
S JComponent u. JPanel ausdrucken AWT, Swing, JavaFX & SWT 3
J SWT JComponent Problem AWT, Swing, JavaFX & SWT 4
T JComponent überzeichnen? AWT, Swing, JavaFX & SWT 2
G JComponent in JTable AWT, Swing, JavaFX & SWT 8
M JComponent wird in JFrame nicht angezeigt AWT, Swing, JavaFX & SWT 4
D bei Thread in JComponent malen NullPointerException AWT, Swing, JavaFX & SWT 3
S Alle EventListener einer JComponent abfragen? AWT, Swing, JavaFX & SWT 3
S JComponent in JPanel darstellen AWT, Swing, JavaFX & SWT 2
N JComponent#getClientProperty(key) welche Schlüssel gibt es? AWT, Swing, JavaFX & SWT 3
E Drucken von JComponent. AWT, Swing, JavaFX & SWT 4
S JComponent ersetzen AWT, Swing, JavaFX & SWT 13
R Resize Problem bei JComponent AWT, Swing, JavaFX & SWT 2
M JButton in JComponent abfragen AWT, Swing, JavaFX & SWT 6
S Mausbehandlungen für JComponent AWT, Swing, JavaFX & SWT 7
M Verschiebbare JComponent AWT, Swing, JavaFX & SWT 5
C zeichnen auf jComponent AWT, Swing, JavaFX & SWT 3
S in einem JComponent zu zeichnen AWT, Swing, JavaFX & SWT 4
G Grafik auf JComponent ohne Überschreiben von Paint-Methoden AWT, Swing, JavaFX & SWT 4
R JComponent malt seine Kinder nicht AWT, Swing, JavaFX & SWT 8
G JComponent Hintergrund AWT, Swing, JavaFX & SWT 3
M JMenu auf JComponent? AWT, Swing, JavaFX & SWT 10
G Graphics (g) und JComponent prob. AWT, Swing, JavaFX & SWT 2
G Klasse XYComponent extends JComponent AWT, Swing, JavaFX & SWT 3
V Swing Neue Größe bei ComponentListener noch nicht verfügbar? AWT, Swing, JavaFX & SWT 3
B ComponentListener hört nicht zu AWT, Swing, JavaFX & SWT 6
F ComponentListener entfernen? AWT, Swing, JavaFX & SWT 14
S ComponentListener funzt nicht AWT, Swing, JavaFX & SWT 3
S JavaFX Image Skalierung in Scrollpane, Scrollpane resized sich nicht AWT, Swing, JavaFX & SWT 5

Ähnliche Java Themen


Oben