Synchrones Window-verschieben

Status
Nicht offen für weitere Antworten.

The_S

Top Contributor
Hi, ich habe mehrere Windows in einer HashMap. Die Windows können von allen möglichen Typen sein, also JFrame, Frame, JDialog, JWindow, ... eben alles was von Window erbt.

Jetzt möchte ich alle Windows, die sich in der HashMap befinden, synchron zueinander verschieben. Ich adde also jedem Window einen Component Listener

Code:
	public void addWindow(Window win) throws NotVisibleException {
		
		if (!win.isVisible()) {
			throw new NotVisibleException(win.getName() + " must be visible");
		}
		win.addWindowListener(this);
		win.addComponentListener(this);
		WinState wis = new WinState();
		wis.setXPos(win.getLocationOnScreen().getX());
		wis.setYPos(win.getLocationOnScreen().getY());
		if (win instanceof Frame) {
			wis.setExtendedState(((Frame)win).getExtendedState());
		}
		map.put(win, wis);
	}

wenn jetzt ein Fenster verschoben wird, bekomme ich das ja durch Aufruf der componentMoved-Methode vom ComponentListener mit. In diesem Fall lasse ich eine eigene Methode für die weitere Verarbeitung sorgen:

Code:
	public void componentMoved(ComponentEvent evt) {
		move(evt);
	}

Wenn ich jetzt einfach alle Fenster in der HashMap in der move-Methode verschieben würde, hätte das ja eine Endlosschleife zur Folge, da bei jedem Aufruf wieder für alle Fenster ein ComponentEvent geworfen werden würde. Also hab ich mir gedacht, legste n Counter an. Beim Aufruf der Methode wird überprüft, ob der Counter == 0 ist. Falls ja, handelt es sich nicht um ein Folgeevent und der eigentliche Code wird ausgeführt:

Zuerst wird der Counter auf die Anzahl der Fenster in der HashMap - 1 gesetzt, und anschließend alle Fenster (ohne das, welches das Event ausgelöst hat) um die entsprechenden Pixel mit der Methode setLocation verschoben.

Ist der Counter ungleich (größer) 0, handelt es sich um ein Folgeevent, und der Counter wird um den Wert eins heruntergezählt.

Code:
	protected void move(ComponentEvent evt) {
		
		if (counterMove == 0) {
			counterMove = map.size() - 1;
			Window moved = (Window)evt.getSource();
			Window cur = null;
			WinState ws = (WinState)map.get(moved);
			double x = moved.getLocationOnScreen().getX() - ws.getXPos();
			double y = moved.getLocationOnScreen().getY() - ws.getYPos();
			Vector wins = new Vector(map.keySet());
			for (int i = 0; i < wins.size(); i++) {
				cur = (Window)wins.get(i);
				if (cur != moved) {
					cur.setLocation((int)(cur.getLocationOnScreen().getX() + x), (int)(cur.getLocationOnScreen().getY() + y));
				}
				actWinState(cur);
			}
		}
		else {
			counterMove--;
		}
	}

Wenn ich da jetzt keinen Denkfehler drin habe, sollte das ja so funktionieren!? Tut es aber nicht. Und zwar werden manchmal alle verschoben, manchmal gar keine, und manchmal nicht alle. Woran das liegt, habe ich auch schon herausgefunden. Und zwar wird, wenn ich bei einem Frame/JFrame die Methode setLocation aufrufe, zweimal ein ComponentEvent gefeuert. Bei einem JDialog aber (wie ich es eigentlich auch von den Frames erwarte) nur einmal.

Ich kann 100pro sicher sagen, dass kein Frame in der HashMap doppelt ist, selbst wenn, sollte es durch die Counter-Methode ja nicht zu Fehlern kommen. Und da nirgends anders "addComponentListener", außer in der oben genannten Methode aufgerufen wird, kann ich eigentlich auch ausschließen, dass bei Frames versehentlich zwei ComponentListener geadded werden.

Weiß jemand warum das so ist, und wie ich das beheben kann?

Danke!
 

Marco13

Top Contributor
Das mit dem Counter hab' ich jetzt nicht ganz gerafft - falls das nicht weiterhilft, müßte ich wohl erstmal ein KSKB basteln, aber grundsätzlich könnte es ja helfen, die Fenster, die schon bewegt wurden, (... irgendwie :roll: ) in eine weitere HashSet zu packen. Da stört es nicht, wenn ein Fenster mehrfach reingepackt wird, und wenn die HashSet genauso groß ist, wie die HashMap, kann man sicher sein, dass alle bewegt wurden.
 

The_S

Top Contributor
argh, man sollte natürlich die extra Listener, die man vor x-jahren testweise in die main mit reingeschrieben hat, nicht so schnell vergessen. Hab die entfernt und schon gehts. Zufällig hatten die Frames also wirklich alle noch einen zweiten Listener. Aber danke für deine Hilfe!

Zum Thema Counter:

Der Counter wird am Anfang so hoch eingestellt, wie erneute Aufrufe dieser Methode erwartet werden. Bei jedem Aufruf wird der Counter dann um 1 reduziert, bis er wieder auf 0 ist.
 

Marco13

Top Contributor
Hmja, es hätte ja sein können, dass...
Und zwar wird, wenn ich bei einem Frame/JFrame die Methode setLocation aufrufe, zweimal ein ComponentEvent gefeuert.
... das ein beständiges "Problem" ist (d.h. auch ohne mehrfach hinzugefügte Listener passiert). Aber wenn's jetzt klappt, ists ja gut.
 

The_S

Top Contributor
Ja, davon bin ich ja auch zuerst ausgegangen. Aber man sollte halt zuerst wirklich jede eigene Fehlerquelle ausmerzen :oops:
 
Status
Nicht offen für weitere Antworten.
Ähnliche Java Themen
  Titel Forum Antworten Datum
izoards Java FX Window Event SHOWING AWT, Swing, JavaFX & SWT 17
ruutaiokwu SWT "Google Window Builder" tut keine jar's ins Projekt rein bei SWT-Projekt AWT, Swing, JavaFX & SWT 22
L JavaFX AnchorPane an die Größe der Scene oder Window binden? AWT, Swing, JavaFX & SWT 3
A Objekt von einem Window erstellen? AWT, Swing, JavaFX & SWT 8
S Window Builder AWT, Swing, JavaFX & SWT 20
I Modal Window AWT, Swing, JavaFX & SWT 26
ralfb1105 JavaFX Wie Text Label in neuem Window von Main Stage setzen? AWT, Swing, JavaFX & SWT 6
C JavaFX Window-Position AWT, Swing, JavaFX & SWT 3
Neumi5694 java.awt.Window nach javafx.stage.Window AWT, Swing, JavaFX & SWT 1
T Custom Window ohne Swing / AWT / FX..?! AWT, Swing, JavaFX & SWT 1
Ghostman1711 GUI Java von Klasse mit Application Windows anderes Application Window aufrufen AWT, Swing, JavaFX & SWT 6
Z Window Builder - Labels mit setText befüllen AWT, Swing, JavaFX & SWT 11
B JavaFX Werte aus eingefügtem Window lesen AWT, Swing, JavaFX & SWT 0
EisKaffee Swing Window Builder installieren AWT, Swing, JavaFX & SWT 1
D SWT Window passt Größe nicht an AWT, Swing, JavaFX & SWT 4
H Drag component out of window AWT, Swing, JavaFX & SWT 1
B Swing "Window Manager" - Gedankenprobleme AWT, Swing, JavaFX & SWT 9
G Window aus anderer Klasse aufrufen AWT, Swing, JavaFX & SWT 4
J Swing Window-Builder-Projekt richtig übertragen AWT, Swing, JavaFX & SWT 2
H Swing Google Window-Builder AWT, Swing, JavaFX & SWT 4
S Flackerndes Window beim DnD AWT, Swing, JavaFX & SWT 37
D SWT CheckBox auslesen (Window Builder Pro) AWT, Swing, JavaFX & SWT 2
frankred Swing Canvas nach "Window-resize" neu Zeichnen lassen wegen Anzeigefehler AWT, Swing, JavaFX & SWT 4
B Swing Window nur bedingt im Vordergrund AWT, Swing, JavaFX & SWT 5
N Window transparent, Komponenten nicht transparent AWT, Swing, JavaFX & SWT 11
R Swing Sequenz aus farbigen Quadraten in Window anzeigen AWT, Swing, JavaFX & SWT 11
J Fehlermeldung adding a window to a container AWT, Swing, JavaFX & SWT 9
L AWT Window, Dialog und verschiedene Betriebssysteme AWT, Swing, JavaFX & SWT 2
3 Eigenes Frame/Window programmieren AWT, Swing, JavaFX & SWT 2
T SWT Window Builder Pro File Dialog anzeigen AWT, Swing, JavaFX & SWT 10
J Swing kann window nicht übergeben AWT, Swing, JavaFX & SWT 14
L Fenster inaktiv setzen / deaktivieren (unable to close window) AWT, Swing, JavaFX & SWT 16
data89 Code-completion-window erzeugen - wie? AWT, Swing, JavaFX & SWT 2
Spin Window Event Beispiel AWT, Swing, JavaFX & SWT 6
H Eclipse View / Window Layout AWT, Swing, JavaFX & SWT 3
T Exception: Adding a window to a container AWT, Swing, JavaFX & SWT 14
M "Window"-Bibilotheck AWT, Swing, JavaFX & SWT 4
I JFrame-Anmerkung "Java Applet Window" entfernen AWT, Swing, JavaFX & SWT 4
K Prompt window in Java? AWT, Swing, JavaFX & SWT 3
S Window über beide Bildschirme maximieren AWT, Swing, JavaFX & SWT 8
F Window#setAlwaysOnTop und Java 1.4.x AWT, Swing, JavaFX & SWT 5
M createImage in Window-Unterklasse AWT, Swing, JavaFX & SWT 4
M Window unterteilen AWT, Swing, JavaFX & SWT 9
R JFrame -- Variable Positionierung durch Window Manager? AWT, Swing, JavaFX & SWT 2
G Window in Taskleiste AWT, Swing, JavaFX & SWT 13
G Window wird angezeigt, nur der Inhalt nicht AWT, Swing, JavaFX & SWT 5
S Window Listener, Exit, bin am Verzweifeln AWT, Swing, JavaFX & SWT 24
U Reaktion auf closing window AWT, Swing, JavaFX & SWT 7
G Listener fuer Window Close AWT, Swing, JavaFX & SWT 2
M not serializable: sun.awt.window.WImage AWT, Swing, JavaFX & SWT 8
N frage ueber D&D von window wie in einige IDE AWT, Swing, JavaFX & SWT 7
P Transparentes Window/JFrame (mit SkinLF?) AWT, Swing, JavaFX & SWT 10
R "Statusbar" - JFrame mit 'Java Applet Window' AWT, Swing, JavaFX & SWT 18
S Performance-Problem: JTextArea als Logging-Window AWT, Swing, JavaFX & SWT 8
J Window Listener funzt nicht richtig AWT, Swing, JavaFX & SWT 5
R Die (J)Frame window listener AWT, Swing, JavaFX & SWT 7
A JavaFX JavaFX images per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 1
O Swing Icon verschwindet beim Verschieben eines JLabels AWT, Swing, JavaFX & SWT 8
Redeason Objekte in meiner GUI verschieben AWT, Swing, JavaFX & SWT 1
H JavaFX Timeline II: Verschieben einer ImageView AWT, Swing, JavaFX & SWT 16
frager2345 JTextLabel im Flowlayout verschieben AWT, Swing, JavaFX & SWT 4
U JavaFX CheckBoxen in GUI verschieben AWT, Swing, JavaFX & SWT 20
M Polygon per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 26
F Popup Menu etwas verschieben AWT, Swing, JavaFX & SWT 2
K JavaFX Element in HBOX nach rechts verschieben AWT, Swing, JavaFX & SWT 2
J Button lässt sich nicht auf dem JPanel verschieben AWT, Swing, JavaFX & SWT 5
M Swing JPanel flüssig verschieben AWT, Swing, JavaFX & SWT 5
T AWT Grafik"Array" einzelne Elemente verschieben AWT, Swing, JavaFX & SWT 1
N JLabel in JTabbedPane verschieben AWT, Swing, JavaFX & SWT 2
B JavaFX Viewport verschieben AWT, Swing, JavaFX & SWT 3
C LayoutManager Bei verkleinern des Fensters, verschieben sich JPanels übereinander. AWT, Swing, JavaFX & SWT 7
C Swing Geschachteltes GUI mit BorderLayout - Vertikal & horizontal Verschieben AWT, Swing, JavaFX & SWT 1
M Swing JPanel innerhalb eines Frames verschieben AWT, Swing, JavaFX & SWT 3
Y Titel Verschieben AWT, Swing, JavaFX & SWT 11
Z Bildervorschau, MouseDragged das Bild verschieben AWT, Swing, JavaFX & SWT 1
M label mit icon verschieben. AWT, Swing, JavaFX & SWT 1
R Swing Elemente verschieben sich im GBL beim Ein/Ausblenden AWT, Swing, JavaFX & SWT 0
W Buttons verschieben AWT, Swing, JavaFX & SWT 3
Z Plot nach links verschieben!! AWT, Swing, JavaFX & SWT 1
M 3D-Grafik Denkfehler bei Verschieben von Shapes AWT, Swing, JavaFX & SWT 0
T JLabel Nullpunkt verschieben AWT, Swing, JavaFX & SWT 6
K JavaFX Spalten der Tabellen verschieben AWT, Swing, JavaFX & SWT 2
P JList/JScroolPane Text verschieben und text wrappen AWT, Swing, JavaFX & SWT 3
L JFrame von der Taskleiste zu den ausgeblendeten Symbolen verschieben AWT, Swing, JavaFX & SWT 2
O Swing Spalten-Position nach verschieben AWT, Swing, JavaFX & SWT 6
T Swing JButton per Drag&Drop verschieben AWT, Swing, JavaFX & SWT 5
L Componenten im JFrame an genaue stelle verschieben. AWT, Swing, JavaFX & SWT 2
D JSplitPane lässt sich nicht verschieben AWT, Swing, JavaFX & SWT 3
A JLabel verschieben AWT, Swing, JavaFX & SWT 9
bluerob JComponenten verschieben sich bei Fenster wechseln AWT, Swing, JavaFX & SWT 3
J jFrame verschieben verhindern AWT, Swing, JavaFX & SWT 4
H Bild mit KeyListener verschieben AWT, Swing, JavaFX & SWT 2
R JTextField Eingabefeld innerhalb verschieben AWT, Swing, JavaFX & SWT 2
P Rectangle verschieben AWT, Swing, JavaFX & SWT 11
C Bild auf Panel vergrößern und verschieben AWT, Swing, JavaFX & SWT 4
P Objekte anzeigen und verschieben - wie? AWT, Swing, JavaFX & SWT 6
H LayoutManager Panel verschieben sich AWT, Swing, JavaFX & SWT 5
B Element schrittweise verschieben AWT, Swing, JavaFX & SWT 2
G Swing JPanel per Maus verschieben AWT, Swing, JavaFX & SWT 5
K Button verschieben AWT, Swing, JavaFX & SWT 4

Ähnliche Java Themen


Oben