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

时间:2018-02-15 18:31:47

标签: java swing jframe awt graphics2d

第一学期CS学生。我正致力于一个自我激励的项目,该项目受到之前任务的启发。

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

Here's a pastebin of my code.

我已经注释掉了setPreferredSize()行,因为它什么也没做,这让我感到困惑。 MyCanvas类是组件,对吧?在那个组件里面我画的是形状和线条。从我所看到的,setPreferredSize()应该在组件中调用,而不是组件内部的方法。我在NewGrid(),组件和paint()方法中尝试了setPreferredSize(),但无论如何,窗口都会出现以下两种方式之一:

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

setPreferredSize() inside NewGrid()

使用setPreferredSize()代码中的任何其他位置:

setPreferredSize() anywhere else in the code

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);
            }
        }
    }
}

1 个答案:

答案 0 :(得分:2)

简答

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

一方面,代码无法编译。

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

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

注意setResizable(...)方法在pack()之前/之后放置时如何影响帧。

更好的答案

  

使用swing和awt,

不要混合使用Swing和AWT组件。

不要扩展Canvas。而是使用JPanel

  

我无法正确缩放窗口以适应组件

通过扩展JPanel来完成Swing中的自定义绘制,然后覆盖自定义绘制的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教程中的部分,了解更多信息和一个工作示例,以帮助您入门。