获得正常的JFrame边界,同时最大化

时间:2013-01-30 20:10:32

标签: java swing window persistence jframe

我正在尝试创建一个记住窗口位置,大小以及是否最大化的JFrame。对于windowClosing事件使用WindowListener并将其边界保存到Preferences应该很简单。

为了使其工作(如下所示),我需要在最大化时(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);
    }
});
//...

如果这是一个非常简单的问题,我道歉。任何帮助表示赞赏。

2 个答案:

答案 0 :(得分: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;
}

我将帧数据保存在属性文件中,但您可以按照自己的意愿保存和恢复帧数据。

答案 1 :(得分:1)

在您的课程中,从var results = samples.GroupBy(sample => { Year = _dt.Year, Month = _dt.Month DValue = _d}) .Select(gr => new { Year = gr.Key.Year, Month = gr.Key.Month, DValue = gr.Key.DValue, AverageValue = gr.Select(item => item.Value).Average() }); 派生,添加以下代码......

JFrame