7年遅れたほうがいいですよね?
おそらくこれが関連するすべてのコードではないため、質問はSSCCEを提供しません。コードの小さな断片がそのまま機能するため、実際には以前のすべての回答は「私にとっては機能する」と言っています。したがって、問題は確かにコードの残りの部分にありますが、表示されていません。
コードの残りの部分が何をしているのかはわかりませんが、フレームの状態と境界を保持し、後でその状態と境界を復元しようとして、それが失敗したのではないかと思います。OPは、実際の問題が何であるかを説明していなかったため、7年前に回答を受け取りませんでしたが、この質問はさらに多くの人に見られるため、次のようになります。
理論的には、フレームの状態と境界を保持することは簡単なはずですが、実際にはそうではありません。
これは GUI アプリケーションでよくある問題で、基本的にはプログラマーのよくある間違いによるものです。ただし、広く使用されているさまざまな GUI フレームワーク (および Java の世界では Swing と SWT の両方) は特定のひねくれた方法で動作するため、非常に簡単に間違いを犯してしまうことに注意してください。
問題は、これらのフレームワークが「最大化」イベントをサポートしていないという事実から始まります (当たり前!)。そのため、フレームが最大化されたことを検出できる唯一の方法は、「サイズ変更」イベントをリッスンすることです。したがって、おそらく「サイズ変更」イベントハンドラー内からフレームの状態と寸法を保持しています。
フレームを最大化した結果として「サイズ変更」イベントが発生すると、フレームの境界はフレームの最大化された境界であり、これは無関係であるという事実によって、問題はさらに複雑になります。あなたはそれらを永続化するという間違いを犯します。
したがって、解決策は、フレームの「通常の状態」の境界を手動で追跡し、それらのみを保持することです。これは次のように実行できます。
addComponentListener( new ComponentAdapter()
{
@Override public void componentResized( ComponentEvent e )
{
if( (getExtendedState() & MAXIMIZED_HORIZ) == 0 )
normalStateBounds.width = getWidth();
if( (getExtendedState() & MAXIMIZED_VERT) == 0 )
normalStateBounds.height = getHeight();
stateAndOrSizeChanged();
}
@Override public void componentMoved( ComponentEvent e )
{
if( (getExtendedState() & MAXIMIZED_HORIZ) == 0 )
normalStateBounds.x = getX();
if( (getExtendedState() & MAXIMIZED_VERT) == 0 )
normalStateBounds.y = getY();
stateAndOrSizeChanged();
}
} );
...どこ:
normalStateBounds
private final Rectangle normalStateBounds = new Rectangle();
「通常の」(最小化も最大化もされていない) 状態のときのコンポーネントの境界として定義され、それを含みます。
stateAndOrSizeChanged()
フレームの状態と境界の永続化を処理する関数normalStateBounds
です。getX()
getY()
getWidth()
getHeight()
永続性から状態と境界をロードするときは、単に を呼び出してから を呼び出すことができます。最大化する前にフレームが瞬く間に復元されたように見える可能性を避けるために、呼び出す前にこれを行う必要がありsetBounds()
ます。を呼び出すと最大化されていない境界が設定され、 を呼び出すとフレームが最大化される可能性がありますが、その後復元すると、設定した最大化されていない境界が想定されます。setExtendedState()
setVisible( true )
setBounds()
setExtendedState()