Swing One componentResized Event

Status
Nicht offen für weitere Antworten.

Dragonfire

Bekanntes Mitglied
Hi,
hab eben den ComponentListener entdeckt und leider auch die Tatsache
das dieser bei einem Resize mehrere Events auslöst ...

Bei aufwendigen Code (z.B. Image resizen),
kann das Programm schonmal "stocken".

Als erste Möglichkeit habe ich den Timer entdeckt:

Java Swing Development: componentMoved and componentResized on JFrame

Diese Lösung finde ich nicht ganz so gut,
meine Idee wäre ein wenig anderes.
Ich vergleiche immer eine ältere Fenstergröße mit einer neueren,
dass Event wird erst ausgeführt,
wenn eine gewissen Zeit sich die Fenstergröße nicht geändert hat:

Java:
...
@Override
public void componentResized(ComponentEvent e) {
	startResize();
}		
...
private Thread t;

private void startResize() {
	if (t == null) {
		t = new Thread() {
			@Override
			public void run() {
				super.run();
				boolean same = false;
				while (!same) {
					int lastw = getWidth();
					int lasth = getHeight();
					for (int i = 0; i < 10; i++) {
						if (lastw == getWidth() && lasth == getHeight()) {
							same = true;
						} else {
							same = false;
						}
					}
				}
				try {
					EventQueue.invokeAndWait(new Runnable() {
						@Override
						public void run() {
							resizeImage();
						}
					});
				} catch (Exception e) {
					// TODO: handle exception
				}
				t = null;
			}
		};
		t.start();
	}
}

Allerdings hackt das auch ein wenig,
bzw, dauert bis er erkennt, wann er das Event ausführen soll
(wenn auch nicht so viel wie bei dem Timer).

Gibt es eine Methode oder Möglichkeit die ich übersehen habe?
 

Dragonfire

Bekanntes Mitglied
*push*

Ist zwar schon ein wenig her,
aber vielleicht hat wer noch eine gute, anderer Idee
in diesem neuen Jahr ;)
 

Dragonfire

Bekanntes Mitglied
Afaik wird bei einem Resize nur ein einziges Event ausgelöst, und zwar beim Loslassen der Maustaste.

Da muss ich dich leider enttäuschen ...
oder habe ich einen falschen Listener verwendet oO ?

Java:
public static void main(String[] args) {
		JFrame f = new JFrame("ResizeTest");
		f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		JPanel testPanel = new JPanel();
		testPanel.add(new JLabel("ResizeTest"));
		testPanel.addComponentListener(new ComponentListener() {
			@Override
			public void componentShown(ComponentEvent e) {
				System.out.println("" + e);
			}

			@Override
			public void componentResized(ComponentEvent e) {
				System.out.println("" + e);
			}

			@Override
			public void componentMoved(ComponentEvent e) {
				System.out.println("" + e);
			}

			@Override
			public void componentHidden(ComponentEvent e) {
				System.out.println("" + e);
			}
		});
		f.add(testPanel);
		f.pack();
		f.setVisible(true);
	}
 

Der Müde Joe

Top Contributor
Wenn ichh mich noch recht erinnere, ist das je nach OS verschieden. So wird der Event bei Win ausgelöst, wenn die Maus losgelassen wird, bei Linux immer wieder mal (oder umgekehrt?)
Hatte mal irgenwo ein Lösung gefunden, find sie aber grad nicht. war aber auch irgend so ein Hack wie oben.
Vielleicht find ich sie ja noch.
 

Dragonfire

Bekanntes Mitglied
wäre cool,
wenn du das finden würdest ^^
Bei Windows XP SP 3
werden die Events sofort beim Resize ausgeführt ...
und das können ganz viele sein,
da kommt dann meine "resize"-Methode nicht mehr hinterher ...

Das Problem ist ja schon ein wenig älter ...
damals hatte ich das noch mit einem MouseListener versucht zu lösen, allerdings bin ich nicht an den Event vom Fensterrahmen gekommen, dass die Maus losgelassen worden ist :-(
 

André Uhres

Top Contributor
Versuch mal den Listener an den Frame zu hängen, anstatt an den JPanel:
f.addComponentListener(new ComponentListener() {
 

Dragonfire

Bekanntes Mitglied
*genial*

Darauf hätte ich auch kommen können xD
Also wenn man den Listener an den Framee hängt, dann geht es ....
Mal sehen wie ich das in meinem Programm umsetze :)

Danke :)

Java:
public static void main(String[] args) {
		JFrame f = new JFrame("ResizeTest");
		f.setDefaultCloseOperation(WindowConstants.DISPOSE_ON_CLOSE);
		f.addComponentListener(new ComponentListener() {
			@Override
			public void componentShown(ComponentEvent e) {
				// do nothing
			}

			@Override
			public void componentResized(ComponentEvent e) {
				System.out.println("" + e);
			}

			@Override
			public void componentMoved(ComponentEvent e) {
				// do nothing
			}

			@Override
			public void componentHidden(ComponentEvent e) {
				// do nothing
			}
		});
		f.add(new JLabel("ResizeTest"));
		f.pack();
		f.setVisible(true);
	}
 

Der Müde Joe

Top Contributor
oh...das du den CL an das Panel hängst ist mir gar nicht aufgefallen.
Meine Lösung hab ich leider nicht mehr gefunden. Habs jedoch kurz getestet und es
ist so, das Linux beim resizen immer wieder mal feuert und win nur beim Mouse-releasen (wenn mans ans Frame hängt)
(so nebenbei als info)
 

Meru

Bekanntes Mitglied
Ich habe auch das Problem gehabt, dass es unter Windows beim Mouse-Release gefeuert wird, aber bei Linux permanent.

Dazu habe ich mal einen Beitrag gefunden der einen kleinen Timer verwendet, der dann nur alle 2 Sekunden das Event auslöst (konfigurierbar). Bringt allerdings den Nachteil mit sich, dass das Event unter Windows auch nur alle 2 Sekunden ausgelöst wird. Dies ist in meiner Anwendung aber eher zu vernachlässigen, da dies im meinem Fall ein "Nebenbei-Effekt" ist, der nicht für die Fortführung der Anwendung nötig ist (will mir frame-Position und frame-Size speichern, damit der Nutzer beim nächsten Aufruf vorzugsweise wieder die gleichen Einstellungen vor sich hat).

Java:
	// Timerobjekt fuer das Verschieben des JFrames
	private static Timer frameMovedTimer;
	private static Timer frameResizedTimer;
	private static final int DELAY = 2000;

	//...
	//...
	//...
	frame.addComponentListener(this);
	frameMovedTimer = new Timer(DELAY, new AbstractAction() {
		public void actionPerformed(ActionEvent e) {
			saveFrameMovedAction();
		}
	});
	frameMovedTimer.setRepeats(false);
					
	frameResizedTimer = new Timer(DELAY, new AbstractAction(){
		public void actionPerformed(ActionEvent e) {
			saveFrameResizedAction();
		}
	});
	//...
	//...
	//...


	@Override
	public void componentMoved(ComponentEvent e) {
		frameMovedTimer.start();	
	}
	@Override
	public void componentResized(ComponentEvent e) {
		frameResizedTimer.start();
	}
	@Override
	public void componentHidden(ComponentEvent e) {}	
	@Override
	public void componentShown(ComponentEvent e) {}


	private void saveFrameMovedAction(){
		// tu dies, tu das
	}
	
	private void saveFrameResizedAction(){
		// tu dies, tu das	
	}
 
Zuletzt bearbeitet:

Dragonfire

Bekanntes Mitglied
Ups, hab nur kurz was gelesen und da kam mir die Problemstellung bekannt vor. Zudem hab ich den Code beim ganz schnellen überfliegen ein wenig falsch interpretiert. Sry ;)

Das kenne ich zu gut xD
Nicht schlimm,
passiert mir auch oft ...
Aber ist dann ganz praktisch für die Leute die hier nochmal die ganzen Sachen nachlesen ;)
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
G Swing JFrame componentResized() kontinuierlich? AWT, Swing, JavaFX & SWT 2
R ComponentResized AWT, Swing, JavaFX & SWT 4
T ComponentEvent - compoenentMoved, componentResized AWT, Swing, JavaFX & SWT 4
Juelin in javafx Event auslösen AWT, Swing, JavaFX & SWT 4
G Mouse Event in anderemm Event auslösen AWT, Swing, JavaFX & SWT 50
schoel27 Mehrere JButtons sollen das gleiche Event auslösen AWT, Swing, JavaFX & SWT 2
K Warum genau hat man einen Listener, dann ein Event und was ist ein Adapter AWT, Swing, JavaFX & SWT 2
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
Fridolin111 Der KeyListener Löst kein event aus AWT, Swing, JavaFX & SWT 6
B JavaFX Von welcher Klasse und zu welchem Zeitpunkt werden Event-Objekte erstellt? AWT, Swing, JavaFX & SWT 3
L JavaFX Ich suche das passende Textfield Event AWT, Swing, JavaFX & SWT 1
J CheckBoxListCell auf click event in listView reagieren AWT, Swing, JavaFX & SWT 1
W JavaFX Etwas Tabellenartiges + Cell-Content-Changed-Event (o.ä.) AWT, Swing, JavaFX & SWT 30
O Swing Event Dispatch Thread AWT, Swing, JavaFX & SWT 1
B Swing Windowbuilder Rückgabewert im Event AWT, Swing, JavaFX & SWT 3
Z Befehl Action Event Verlassen AWT, Swing, JavaFX & SWT 4
F Event wenn Maus eine JList verlässt AWT, Swing, JavaFX & SWT 13
M JavaFX Absoluter Fokus während drag Event AWT, Swing, JavaFX & SWT 10
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
K Event Handling ComboBox Event Handler AWT, Swing, JavaFX & SWT 7
Sugan Swipe Event? AWT, Swing, JavaFX & SWT 8
Tausendsassa Text changed event handler jTextField AWT, Swing, JavaFX & SWT 3
H Event Handling JavaFx - auf Event warten AWT, Swing, JavaFX & SWT 4
G Event Handling Event Handling in eigene Klasse AWT, Swing, JavaFX & SWT 4
M Mouse Click Event ohne ein JComponent Objekt AWT, Swing, JavaFX & SWT 3
L JDialog - Event wenn Parent größe ändert AWT, Swing, JavaFX & SWT 2
T Internes Event-handling in TextField/JTextField AWT, Swing, JavaFX & SWT 2
M Swing OnLoad-Event o. Ä. AWT, Swing, JavaFX & SWT 3
D Event Handling in Komplexen Anwendungen AWT, Swing, JavaFX & SWT 9
D Event Handling "Plötzlich" kein mouseMoved-Event AWT, Swing, JavaFX & SWT 2
A Minimalestopuhr: JLabel.setText() durch eigenes Event ändern AWT, Swing, JavaFX & SWT 6
J Swing JMenuItem-Event?? AWT, Swing, JavaFX & SWT 3
J Swing JTable-Event für einen Select?? AWT, Swing, JavaFX & SWT 3
A Mouse event und exit on close AWT, Swing, JavaFX & SWT 11
V Swing Custom JToggleButton in JTable - Click-Event geht erst beim zweiten Mal AWT, Swing, JavaFX & SWT 7
F Event Handling AWT, Swing, JavaFX & SWT 7
J Button Event nur einmal ausführen AWT, Swing, JavaFX & SWT 3
S SWT Shell durch Event in der Größe verändern AWT, Swing, JavaFX & SWT 7
J Speichern, Event, Hintergrund getAppletContext AWT, Swing, JavaFX & SWT 2
T Callback vs. Event listener AWT, Swing, JavaFX & SWT 7
F Frage zu Event KeyTyped bei jPanel AWT, Swing, JavaFX & SWT 4
S MenuBar ActionListener Event ... AWT, Swing, JavaFX & SWT 6
T Anzahl Event Listeners AWT, Swing, JavaFX & SWT 4
A Swing JButton int im Event AWT, Swing, JavaFX & SWT 9
G Swing Onkeyup Event AWT, Swing, JavaFX & SWT 3
P Action Event abfangen etwas anders? AWT, Swing, JavaFX & SWT 2
3 Swing NullPointerException in AW Event-0? AWT, Swing, JavaFX & SWT 5
F Swing Auf JComboBox-Event erst NACH Auswahl reagieren AWT, Swing, JavaFX & SWT 8
P Swing Event das ausgelöst wird, sobald Änderung der Größe Abgeschlossen ist AWT, Swing, JavaFX & SWT 4
A Shift-Tab-Event auslösen AWT, Swing, JavaFX & SWT 5
T Event Dispatch Thread und noch ein Thread AWT, Swing, JavaFX & SWT 7
W Swing Event bei Schließen des Fensters AWT, Swing, JavaFX & SWT 6
A Probleme mit dem KeyReleased-event AWT, Swing, JavaFX & SWT 3
J Doppelklick Event AWT, Swing, JavaFX & SWT 32
jueki Event bei Änderung der Spaltenbreite in einem JTable AWT, Swing, JavaFX & SWT 15
D jtabbedpane Event VOR tab-Wechsel AWT, Swing, JavaFX & SWT 3
N Swing JComboBox Event Problem AWT, Swing, JavaFX & SWT 5
M JTree => Event Dispatching Error AWT, Swing, JavaFX & SWT 2
D Event in Fenster ausgeben + Observer + kein Plan AWT, Swing, JavaFX & SWT 2
H warum kann ich das focus event nicht abfangen ? AWT, Swing, JavaFX & SWT 5
X Den Wert von JSpinner setzen ohne Event AWT, Swing, JavaFX & SWT 3
H KeyUp-Event/Ereignis AWT, Swing, JavaFX & SWT 6
C Event Frage AWT, Swing, JavaFX & SWT 7
M Swing WindowListener -> Event abbrechen? AWT, Swing, JavaFX & SWT 2
K JToggleButton deaktivieren (komplettes event nehmen) AWT, Swing, JavaFX & SWT 2
R JTextField - Event bei jedem Buchstaben AWT, Swing, JavaFX & SWT 2
R WindowClosing Event - Schließen rückgängig machen? AWT, Swing, JavaFX & SWT 2
M Actionlistener ohne Event -.-?! AWT, Swing, JavaFX & SWT 2
O Probleme beim Zeichnen und AWT-Event-Queue-0 Exception AWT, Swing, JavaFX & SWT 5
D PropertyChangeListener Event auswertung AWT, Swing, JavaFX & SWT 7
O FlowLayout Button Event zuweisen? AWT, Swing, JavaFX & SWT 7
J remove() components bei event von JComboBox AWT, Swing, JavaFX & SWT 2
I event AWT, Swing, JavaFX & SWT 6
G Swing JFileChooser Event für neue Directory? AWT, Swing, JavaFX & SWT 5
X Checkboxen erstellt mit MouseClicked event AWT, Swing, JavaFX & SWT 10
data89 Was mache ich mit "Dispatched Event Thread"/Substance falsch? AWT, Swing, JavaFX & SWT 4
Kr0e Event simulieren AWT, Swing, JavaFX & SWT 5
S Tastatur Event auserhalb des fokuses aufnehmen AWT, Swing, JavaFX & SWT 4
R Swing ComboBox und doppelter Event!? AWT, Swing, JavaFX & SWT 10
M Swing Event mit Button AWT, Swing, JavaFX & SWT 7
B Wie kann ich ein event wieder beseitigen AWT, Swing, JavaFX & SWT 2
R Checkboxen - Event mit Controller abfangen AWT, Swing, JavaFX & SWT 7
Spin Window Event Beispiel AWT, Swing, JavaFX & SWT 6
O Tabelle über Event sortieren AWT, Swing, JavaFX & SWT 4
Iron Monkey JTable 2 Selektionsfarben Mouse-Event AWT, Swing, JavaFX & SWT 8
Dragonfire JTree, Selection via event AWT, Swing, JavaFX & SWT 7
K JButton auf JPanel in JTable (Darstellungs-/Event-Probleme) AWT, Swing, JavaFX & SWT 16
B JInternalFrame resize event AWT, Swing, JavaFX & SWT 2
E Komponenten in Event Dispatch Thread erzeugen? AWT, Swing, JavaFX & SWT 4
D Event beim Laden eines JPanels? AWT, Swing, JavaFX & SWT 3
O Action Event auslösen bei unbekanntem JTextField AWT, Swing, JavaFX & SWT 3
R Registrieren um Event abzufangen AWT, Swing, JavaFX & SWT 3
N solange Maustaste gedrückt Event AWT, Swing, JavaFX & SWT 15
Daniel_L Nachrichten/Event aus nicht-modalen Dialogen abfragen? AWT, Swing, JavaFX & SWT 4
G Event an einer JComboBox registrieren AWT, Swing, JavaFX & SWT 8
S Welches Event beim ändern einer Zelle in einer JTable AWT, Swing, JavaFX & SWT 4
S Welches Event beim auswählen einer Zelle? [JTable] AWT, Swing, JavaFX & SWT 3
A Event von Login zu Main klasse AWT, Swing, JavaFX & SWT 2
E bei gedrückte Taste --> Bitte nur ein Event auslösen AWT, Swing, JavaFX & SWT 4
W Kein MouseKlick-Event bei Bewegung AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben