Google Groups no longer supports new Usenet posts or subscriptions. Historical content remains viewable.
Dismiss

Normalgröße eines maximierten Fensters ermitteln?

5 views
Skip to first unread message

Egon Schmid

unread,
Oct 1, 2009, 6:55:48 AM10/1/09
to
Hallo!

Ich mᅵchte die Lage und Grᅵᅵe eines Fensters ("bounds") beim Beenden
speichern. Diese lᅵsst sich mit getBounds() ermitteln...

Wenn das Fenster jedoch maximiert ist, liefert getBounds() die Grᅵᅵe im
maximierten Zustand, es soll jedoch die unmaximierte Grᅵᅵe gespeichern
werden. Kann man die irgendwie ermitteln?

Viele Grᅵᅵe

Egon Schmid

Kurt Harders

unread,
Oct 1, 2009, 7:22:08 AM10/1/09
to
Hallo Egon,

Egon Schmid schrieb:

Speichere die Bounds immer dann, wenn ein WindowStateChanged-Event
kommt. Dazu trᅵgst Du einen WindowStateListener ein, und fragst den
jeweils neuen Zustand ab.

Grᅵᅵe, Kurt

--
Kurt Harders
PiN GmbH
Leimbacher Str. 36
42281 Wuppertal

T +49 202 2 50 11 64
F +49 202 2 50 11 65
M +49 171 8 36 82 33

Geschᅵftsfᅵhrer:
Kurt Harders und Andre Dressler

Eingetragen beim AG Wuppertal
HRB 9102
USt.ID DE 186029298

Stefan Kuhne

unread,
Oct 1, 2009, 7:58:52 AM10/1/09
to
Egon Schmid schrieb:
Meine exit():
void exit() {
closeAll();
if (openFiles.isEmpty()) {
System.out.println();
System.out.println();
if (editWindow.getExtendedState() == JFrame.MAXIMIZED_BOTH) {
settings.setMaximized(true);
editWindow.setExtendedState(0);
} else {
settings.setMaximized(false);
}
settings.setSize(editWindow.getSize());
settings.setLocation(editWindow.getLocation());
writeSettings();
editWindow.setVisible(false);
editWindow.dispose();
System.exit(0);
}
}

Stefan Kuhne

Egon Schmid

unread,
Oct 14, 2009, 3:21:35 PM10/14/09
to
Sowohl mit dem WindowStateListener als auch bei "Normalisierung" mittels
"setExtendedState(0)", liefert getBounds() nicht zuverlᅵssig die
richtige Fenster-Position.

- Bei einem WindowStateChanged unter Windows, wenn das Fenster maximiert
wird, sind x und y stets -4

so probierte ich es mit setExtendedState(0) stattdessen. Doch hier
lieferte getBounds() ich unter Linux die Maximalgroesse...

Wenn man statt eines WindowStateListeners einen ComponentListener
verwendet, dann funktioniert's:

public class MyFrame extends JFrame implements ComponentListener {
private Rectangle bounds;

public MyFrame() {
addComponentListener(this);
}

public void componentResized(ComponentEvent e) {
if((getExtendedState()&JFrame.MAXIMIZED_BOTH)==0) {
bounds=getBounds();
}
}

public void componentMoved(ComponentEvent e) {
if((getExtendedState()&JFrame.MAXIMIZED_BOTH)==0) {
bounds=getBounds();
}
}

public void componentShown(ComponentEvent e) {

}

public void componentHidden(ComponentEvent e) {

}
}

Jens Vonderheide

unread,
Oct 15, 2009, 12:39:45 PM10/15/09
to
Egon Schmid wrote:
> Wenn man statt eines WindowStateListeners einen ComponentListener
> verwendet, dann funktioniert's:
[snip]

Vorsicht, zumindest unter Windows feuert resized, nachdem das Fenster
maximiert wurde.

Ich habe das so gelᅵst:

private class WindowPositionSizeListener extends WindowAdapter implements
ComponentListener {

@Override
public void windowStateChanged(WindowEvent e) {
state.setMaximized(e.getNewState() == Frame.MAXIMIZED_BOTH);
}

@Override
public void componentHidden(ComponentEvent e) {
}

@Override
public void componentMoved(ComponentEvent e) {
handleComponentEvent(e);
}

@Override
public void componentResized(ComponentEvent e) {
handleComponentEvent(e);
}

@Override
public void componentShown(ComponentEvent e) {
}

private void handleComponentEvent(ComponentEvent e) {
Component c = e.getComponent();
if (c instanceof Frame) {
state.setBounds(((Frame) c).getBounds());
}
}
}

private class State {
private Rectangle bounds;
private boolean isMaximized;
// used to correctly handle maximization
private Rectangle lastBounds = null;

public void setBounds(Rectangle bounds) {
synchronized (this) {
if (!isMaximized) {
// ignore changes to the bounds while the window is
// maximized
if (this.bounds != null && !this.bounds.equals(bounds)) {
lastBounds = this.bounds;
}
this.bounds = bounds;
}
}
}

public void setMaximized(boolean isMaximized) {
synchronized (this) {
this.isMaximized = isMaximized;
if (isMaximized && lastBounds != null) {
this.bounds = this.lastBounds;
}
}
}
}

Der Code ist bᅵsartig aus einer grᅵᅵeren Klasse rausgeschnitten und wird
so nicht compilieren, sollte aber die Idee verdeutlichen.
Ach ja, zur vollstᅵndigen Plattformunabhᅵngigkeit sollte man noch die
beiden anderen MAXIMIZED-Fᅵlle behandeln...

Gruᅵ,
Jens

0 new messages