java - 最大化时获取正常的 JFrame 边界

标签 java swing window persistence jframe

我正在尝试创建一个 JFrame 来记住它的窗口位置、大小以及是否最大化。使用 WindowListener 来处理 windowClosing 事件并将其边界保存到首选项应该足够简单。

为了使其工作(如下设置),我需要在 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);
    }
});
//...

如果这是一个非常简单的问题,我深表歉意。如有任何帮助,我们将不胜感激。

最佳答案

这就是我所做的。模型实例保存了框架原点、框架边界和框架状态。

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;
}

我将帧数据保存在属性文件中,但您可以根据需要保存和恢复帧数据。

关于java - 最大化时获取正常的 JFrame 边界,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14612757/

相关文章:

java - org.hibernate.HibernateException :/hibernate. 未找到 cfg.xml

java - Jpanel绘画未清除

javascript - 为什么这个 === 窗口在 JavaScript 作用域安全构造函数中是假的?

wpf - 在 Window 的标题栏中/上方添加 UserControl

java - 在 MongoDB Java 中过滤文档或子文档中的数组

java - 为什么这个数组不接受用户输入?

java - 设置 JButton 的宽度以容纳一定数量的字符

Java - invokeLater 将不会运行

java - 我有一个 JApplet,它必须显示 3 个组件。 (2 个 JPanel 和 1 个 Paint 方法)

c++ - 如何使用 GetTokenInformation() 恢复权限? C++