Y-Position mit get-/setLocation() unter Linux/Enlightement16 inkonsistent

  • Themenstarter Themenstarter HobbyProgger
  • Beginndatum Beginndatum
H

HobbyProgger

Gast
Hallo Leute, ich hoffe ihr könnt mir bei folgendem Problem weiterhelfen:

ich speichere beim Schließen eines Fensters dessen Position [ wnd.getLocation() ]. Beim nächsten Programmstart werden die alten Positionswerte wieder ausgelesen und die Position des Fensters damit gesetzt [ wnd.setLocation( config.windowPosition ) ]. Leider wird das Fenster dabei immer ein Stückchen weiter unten gezeichnet. Es sind immer 21 Pixel, was genau der Höhe der Titelleiste entsprechen dürfte (Enlightement16).

Als "Workaround" lese ich momentan nach dem Setzen der Fenster-Koordinaten diese gleich wieder aus und berechne die Differenz zum ursprünglichen gespeicherten Wert. Wenn ich dann wie folgt das Fenster um diese Different verschoben zeichne:

config.windowPosition.y -= diff;
wnd.setLocation( config.windowPosition );

Dann stimmt die Fensterposition bei jedem zweiten Programmstart leider immer noch nicht... (zur Hälfte stimmte es dann aber)

Woran liegt das? Was mache ich falsch??
 
Hm. Das klingt komisch. Sicher, dass Du synchron zum EDT arbeitest? Debug Dich doch mal in setLocation rein und guck mal wie das kommt... Ansonsten hab ich auch keine Ahnung.

Ebenius
 
Hallo Ebenius!

Hm. Das klingt komisch.
Ja, verhält sich auch nur unter Linux (in meinem Falle Enlightement16 Desktop) so - nicht aber unter Windows, da funktioniert es!

Sicher, dass Du synchron zum EDT arbeitest?
Keine Ahnung. Meinst du damit Event-Dispatch-Thread-synchron?

Debug Dich doch mal in setLocation rein und guck mal wie das kommt...
Da kommen nur tausende von Funktionsrufen, welche kaum weiter helfen...
Allerdings kann ich soviel sagen, dass die Position vom Frame richtig zurückgegeben wird, diese auch korrekt in die Datei geschrieben und wieder korrekt gelesen wird. Die Position wird ansich auch richtig gesetzt, nur passiert beim anzeigen des Frames scheinbar noch etwas mehr - interessant ist folgendes Phänomenon:

Code:
	// Wenn ich mir vor und nach dem Sichtbarmachen des Fensters dessen Position anzeigen lasse,
	// dann werden oft (aber nicht immer!) unterschiedliche Koordinaten ausgegeben.
	// (wenn zuvor keine Fensterposition definiert wurde, erhält man die nachstehenden Ausgaben)
	System.out.println(this.getX() + "x" + this.getY());	// 0x0
	this.setVisible( true );
	System.out.println(this.getX() + "x" + this.getY());	// 1x21 (manchmal aber auch 0x0!)
	// Die Angaben  ensprechen 100%ig der FrameBorder: 21 Pixel hohe Titelleiste, 1 Pixel breiter linker Rand!

	// Den Fehler könnte man mit folgendem Kode nach this.setVisible(true); korrigieren:
	this.setLocation( config.windowPosition.x - this.getX(), config.windowPosition.y - this.getY() );
	// Allerings klappt dies wie erwähnt nicht immer! - Außerdem entsteht so ein hässlicher Sprung beim Anzeigen,
	// da das Fenster erst angezeigt werden muss und dann erst dessen Position gesetzt wird.

Ich halte das Ganze für einen Bug. Wie sehts du das?

Oder sollte ich die Position nicht im Konstrukter festlegen? Aber wie bekomme ich das dann hin, ohne den Anwender der Klasse zu einem Extra-Befehl zu nötigen?

Gibt es vlt. eine andere Methode, mit welcher man die interene Positionsänderung erzwingen kann (wenn möglich mit Sicherheit).

Oder sollte ich es mal mit Frames anderer Bibliotheken probieren?
- Welche eignen sich zum Substituieren, so das kaum Änderungen am restlichen Kode nötig werden?
 
Bau Dir mal deine main-Methode so um und probier damit:
Java:
public static void main(final String[] args) {
  SwingUtilities.invokeLater(new Runnable() {
    public void run() {
      createAndShowGui(args);
    }
  });
}

static void createAndShowGui(String[] args) {
  // was auch immer vorher in main() stand...
}
Ebenius
 

Zurück
Oben