有人可以解释为什么pack()不能使用这个JFrame吗?
里面有一个JPanel(实际上是一个扩展JPanel的类 - inner
)。
这是我正在使用的代码:
inner.setPreferredSize(new Dimension(800, 600));
add(inner);
pack();
setResizable(false);
setLocationRelativeTo(null); // to center the JFrame on screen
setDefaultCloseOperation(EXIT_ON_CLOSE);
setVisible(true);
额外空间似乎是JFrame装饰的确切宽度和高度(即JFrame的尺寸减去JPanel的尺寸)。
答案 0 :(得分:3)
在 setResizable(false)
之前调用pack()
。 “额外空间似乎是JFrame
装饰的确切宽度和高度并非巧合。”
附录:这是sscce,显示我的初步猜测不正确。
import java.awt.Color;
import java.awt.Dimension;
import java.awt.EventQueue;
import java.awt.FlowLayout;
import javax.swing.BorderFactory;
import javax.swing.JFrame;
import javax.swing.JPanel;
/** @see http://stackoverflow.com/questions/7924830 */
public class NonResizable extends JPanel {
public NonResizable() {
this.setPreferredSize(new Dimension(400, 300));
this.setBackground(Color.lightGray);
this.setBorder(BorderFactory.createLineBorder(Color.blue));
}
private void display() {
JFrame f = new JFrame("NonResizable");
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(new FlowLayout());
f.setBackground(Color.white);
f.add(this);
f.pack();
f.setResizable(false);
f.setLocationRelativeTo(null);
f.setSize(500, 400);
f.setVisible(true);
}
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
@Override
public void run() {
new NonResizable().display();
}
});
}
}
答案 1 :(得分:0)
原来我是从JFrame而不是JPanel绘制(主动渲染)...所以额外的空间是JPanel的draw()对象在0,0(在JFrame中)对齐的结果。
由this post解决。