使用 pack() 将 JFrame 缩放到适当大小的问题

Problems scaling JFrame to proper size using pack()

第一学期CS学生。我正在从事一个受之前任务启发的自我激励项目。

使用 swing 和 awt,我试图创建一个 JFrame 并在其中绘画,但我无法使 window 正确缩放以适应我使用 pack() 添加的组件.

Here's a pastebin of my code.

我已经注释掉了 setPreferredSize() 行,因为它什么都不做,这正是我感到困惑的地方。 class MyCanvas 是组件吧?在该组件内部,我正在绘制形状和线条。据我所知,setPreferredSize() 应该在组件中调用,而不是组件内部的方法。我已经在 NewGrid()、组件和 paint() 方法中尝试了 setPreferredSize(),但无论如何,window 以两种方式之一出现:

586 x 593,在 NewGrid() 中使用 setPreferredSize():

在代码的其他任何地方使用 setPreferredSize():

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

public class NewGrid extends JFrame {
    private MyCanvas canvas = new MyCanvas();
    private int size = 600;

    public static void main(String[] args) {
        NewGrid newGrid = new NewGrid();
    }

    public NewGrid() {
        add(canvas);
        pack();
        setVisible(true);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setLocationRelativeTo(null);
        setResizable(false);
    }

    private class MyCanvas extends Canvas {
        //setPreferredSize(new Dimension(600, 600));    // this line does nothing and I can't figure out why
        @Override
        public void paint(Graphics g) {
            int number = 10;
            int spacing = size / number;

            g.setColor(Color.darkGray);
            g.fillRect(0, 0, size, size);    // creates a background square on which I can draw some grid lines

            // grid line loop
            for (int i = 0; i < number + 1; i++) {
                int lineStart = i * spacing;
                g.setColor(Color.green);
                // Vertical lines
                g.drawLine(lineStart, 0, lineStart, size);
                // Horizontal lines
                g.drawLine(0, lineStart, size, lineStart);
            }
        }
    }
}

简答

//setPreferredSize(new Dimension(600, 600));
// this line does nothing and I can't figure out why

一方面,代码无法编译。

该语句需要成为 class 的构造函数的一部分。 Sp你需要用上面的语句添加构造函数。

此外,pack()setVisible(...) 语句应该是最后执行的语句,在将所有组件添加到框架并设置框架的属性之后。

注意 setResizable(...) 方法在放置 before/after pack() 时如何影响框架。

更好的答案

Using swing and awt,

不要混用 Swing 和 AWT 组件。

不要扩展 Canvas。而是使用 JPanel.

I can't get the window to scale properly to fit the components

Swing 中的自定义绘制是通过扩展 JPanel 完成的,然后您覆盖自定义绘制的 paintComponent(...)

最后,您在面板上实现了 getPreferredSize(),这样布局管理器和 pack() 方法就可以完成它们的工作了。

public class MyPanel extend JPanel
{
    @Override
    protected void paintComponent(Graphics g)
    {
        super.paintComponent( g );

        //  add custom painting code
    }

    @Override
    public Dimension getPreferredSize()
    {
        return new Dimension(...);
    }
}

阅读 Custom Painting 上 Swing 教程中的部分,了解更多信息和帮助您入门的工作示例。