这是我的代码:
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()
并检查新大小是否小于所需大小 - 在
JFrame
的paint(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/