java - setDefaultLookAndFeelDecorated 影响 JFrame 调整大小行为

标签 java swing jframe resize look-and-feel

这是我的代码:

import java.awt.Dimension;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.SwingUtilities;


public class Test{


public static void main(String[] args){

    SwingUtilities.invokeLater(new Runnable(){

        @Override
        public void run() {

            JFrame.setDefaultLookAndFeelDecorated(true);

            JFrame frame = new JFrame();
            JPanel jp = new JPanel();

            jp.setMinimumSize(new Dimension(200, 200));
            jp.setPreferredSize(new Dimension(200, 200));

            //frame.getContentPane().setMinimumSize(new Dimension(200, 200));
            //frame.getContentPane().setPreferredSize(new Dimension(200, 200));

            frame.getContentPane().add(jp);

            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setVisible(true);
        }
    });
}
}

它的行为完全符合我的要求。用户可以调整 JFrame 的大小,但它总是足够大以容纳 200px x 200px JPanel。但是当我删除时:

JFrame.setDefaultLookAndFeelDecorated(true);

用户可以将 JFrame 调整为任意大小。

为什么默认的外观装饰会影响调整大小?如果没有 setDefaultLookAndFeelDecorated(true),我如何让它工作?我知道我可以手动设置帧的最小大小 (JFrame#setMinimumSize(new Dimension dim)),如果没有更智能的解决方案,我会这样做。

我在 Windows 7 上使用 jdk 1.7。

最佳答案

This曾经是一个错误,该页面谈到了解决方法,例如:

  • 覆盖 setSize() 并检查新大小是否小于所需大小
  • JFramepaint(Graphics g) 中检查高度和宽度,并将框架“重新创建”到新的最小尺寸

但是有人声称它已修复,因为为错误提议发布的原始示例省略了对 setMinimumSize(...) 的调用,这是必需的,因为 JFrame 不强制执行最小大小

这是显示人员代码的片段:

import java.awt.Dimension;
import javax.swing.*;

public class JavaApplication118 {

    private final Dimension m_dim = new Dimension(200, 150);

    public static void main(String[] args) {
        SwingUtilities.invokeLater(new Runnable() {

            @Override
            public void run() {
                new JavaApplication118().createAndShowUI();
            }
        });
    }

    private void createAndShowUI() {

        // JFrame.setDefaultLookAndFeelDecorated(true);

        final JFrame frame = new JFrame("Test") {

            @Override
            public Dimension getMinimumSize() {
                return m_dim;
            }

        };

        frame.setMinimumSize(m_dim);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        initComponents(frame);

        // frame.setResizable(false);
        frame.pack();
        frame.setVisible(true);
    }

    private void initComponents(JFrame frame) {
        JPanel jp = new JPanel();

        jp.setMinimumSize(new Dimension(200, 200));
        jp.setPreferredSize(new Dimension(400, 400));//for testing

        frame.getContentPane().add(jp);
    }
}

编辑

虽然在调用 setMinimumSize(..) 之后这看起来多余,但代码片段覆盖了 getMinimumSize(),我保留了它,因为这是我找到代码片段的方式(我确实删除了片段包含的 JFrame 的重写 getPreferredSize() 方法)。

关于java - setDefaultLookAndFeelDecorated 影响 JFrame 调整大小行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12663520/

相关文章:

java - 使用 swing 布局具有多个自定义组件的 jpanel

java - JLabel ImageIcon 未正确平滑

Java - 如何创建自定义对话框?

java - 禁用-启用 jframe eclipse

java - 使用 JAXB 注释时如何解开 JSON 的根?

java - 如何删除 GridLayout (Java) 中 ImageIcons 之间的空间

java - 具有 flavor 的gradle重复类错误

java - 在 JTable 中显示文本文件内容

java - 将 Java lambda 的结果分配给字段

java - android中类似于iOS的VOIP推送和调用套件的调用