2

ウィンドウの位置、サイズ、最大化されているかどうかを記憶する JFrame を作成しようとしています。windowClosing イベントに WindowListener を使用し、その境界を設定に保存するのは十分に簡単なはずです。

これを機能させるには (以下の設定に従って)、JFrame が最大化されている間 (MAXIMIZED_BOTH ExtendedState)、JFrame の通常の (NORMAL ExtendedState) 境界を抽出する必要があります。これはまったく可能ですか?元に戻すために、通常の境界がどこかに保存されていることを考慮してください。

//...
addWindowListener(new WindowListener() {
    ///...
    @Override
    public void windowClosing(WindowEvent e) {
        prefs.putBoolean("win_max",win_max);
        if(winmax)
        {
            //win_x=?
            //win_y=?
            //win_w=?
            //win_h=?
        }
        else
        {
            win_x=getX();
            win_y=getY();
            win_w=getWidth();
            win_h=getHeight();
        }
        prefs.putInt("win_x",win_x);
        prefs.putInt("win_y",win_y);
        prefs.putInt("win_w",win_w);
        prefs.putInt("win_h",win_h);
    }
});
//...

これが本当に簡単な質問である場合は申し訳ありません。どんな助けでも大歓迎です。

4

2 に答える 2

3

これが私がしたことです。モデル インスタンスは、フレームの原点、フレームの境界、およびフレームの状態を保存しました。

protected int           state;

protected Point         frameOrigin;

protected Rectangle     frameBounds;

これは、フレーム データの変更をキャプチャするために作成したコンポーネント リスナーです。

    frame.addComponentListener(new ComponentAdapter() {
        @Override
        public void componentMoved(ComponentEvent event) {
            if (isMaximized()) {
                model.setFrameOrigin(frame.getLocation());
            } else {
                model.setFrameBounds(frame.getBounds());
            }
            model.setFrameState(frame.getExtendedState());
        }
        @Override
        public void componentResized(ComponentEvent event) {
            model.setFrameState(frame.getExtendedState());
        }
    });

これは、フレームを最後に使用した状態に設定するためにフレームをパッキングした後に実行しなければならなかったコードです。

    frame.pack();
    if (options.getFrameBounds().getWidth() > 0) {
        frame.setExtendedState(options.getState());
        if (isMaximized()) {
            frame.setLocation(options.getFrameOrigin());
        } else {
            frame.setBounds(options.getFrameBounds());
        }
    }
    model.setFrameState(frame.getExtendedState());
    model.setFrameBounds(frame.getBounds());
    model.setFrameOrigin(frame.getLocation());

で、isMaximized方法はこうです。

public boolean isMaximized() {
    return (frame.getExtendedState() & JFrame.MAXIMIZED_BOTH) 
            == JFrame.MAXIMIZED_BOTH;
}

フレーム データをプロパティ ファイルに保存しましたが、必要に応じてフレーム データを保存および復元できます。

于 2013-01-30T20:32:45.257 に答える
1

から派生したクラス内JFrameに、次のコードを追加します...

private Rectangle m_normalBounds;

@Override
public void setExtendedState(int state)
{
   if (getExtendedState() == 0)
      m_bounds = getBounds();        // Capture the normal bounds since the state is changing

   super.setExtendedState(state);
}

private Rectangle getNormalBounds()  // Always returns the normal bounds
{
   Rectangle bounds;

   if (getExtendedState() == 0)
      return(getBounds());

   return(m_normalBounds);
}
于 2016-02-06T00:00:43.260 に答える