Jframe 和 Jpanel 大小不起作用



我有一个类骨架,它制作一个表面并将大小设置为 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)。这也使您不必使用插图。

最新更新