我有一个类骨架,它制作一个表面并将大小设置为 400x400
public class Skeleton extends JFrame {
public Skeleton()
{
initUI();
}
private void initUI()
{
setTitle("");
int height = 400;
int width = 400;
add(new Surface());
setPreferredSize(new Dimension(width + getInsets().left + getInsets().right,
height + getInsets().top + getInsets().bottom));
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
pack();
setLocationRelativeTo(null);
setVisible(true);
//setResizable(false);
}
public static void main(String[] args)
{
SwingUtilities.invokeLater(new Runnable()
{
@Override
public void run() {
Skeleton sk = new Skeleton();
sk.setVisible(true);
}
});
}
}
然后在表面类中,我画一条从 (0,0) 到 (400,400) 的线,当我运行代码时,对角线的底端离开面板。
class Surface extends JPanel
{
private void makediag(Graphics g, int size)
{
Graphics2D g2d = (Graphics2D) g;
g2d.setColor(Color.blue);
g2d.drawLine(0, 0, size, size);
}
@Override
public void paintComponent(Graphics g)
{
super.paintComponent(g);
makediag(g, 400);
}
}
我做错了什么?面板的大小是否错误或绘图坐标不同?
JPanel
的大小是错误的,因为您正在为JFrame
设置首选大小。
最好的方法是重写JPanels
getPreferredSize
方法并返回所需的维度。
protected Dimension getPreferredSize() {
return new Dimension(400, 400);
}
另外,请务必为您的JFrame
打电话给pack
。根本不给setXXXSize
打电话。
根据 javadoc for pack
使此窗口的大小适合首选大小和布局 其子组件。
因此,窗口应该忽略其自己的首选大小,并使用其子组件的首选大小。没有理由期望setPreferredSize
会影响框架的大小。似乎您真正想做的是将 Surface 的首选大小设置为 (400,400)。这也使您不必使用插图。