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
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
- 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) {
}
}
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