代码之家  ›  专栏  ›  技术社区  ›  ddejohn

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

  •  -2
  • ddejohn  · 技术社区  · 7 年前

    第一学期CS学生。我正在从事一个自我激励的项目,该项目的灵感来自于之前的一项任务。

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

    Here's a pastebin of my code.

    我注释掉了setPreferredSize()行,因为它什么都不做,这就是我所困惑的。MyCanvas类是组件,对吗?在这个组件里面,我画的是形状和线条。据我所见,setPreferredSize()应该在组件中调用,而不是在组件内部的方法中调用。我在NewGrid()组件和paint()方法中尝试了setPreferredSize(),但不管怎样,窗口都会以两种方式之一出现:

    586 x 593,其中setPreferredSize()位于NewGrid()内:

    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 回复  |  直到 7 年前
        1
  •  2
  •   Community CDub    4 年前

    简短回答

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

    首先,代码不会编译。

    该语句必须是类的构造函数的一部分。Sp您需要使用上述语句添加构造函数。

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

    请注意setResizeable(…)是如何调整大小的方法影响放置在pack()之前/之后的帧。

    更好的答案

    使用swing和awt,

    不要混合Swing和AWT组件。

    不要扩展画布。而是使用 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(...);
        }
    }
    

    阅读Swing教程中的部分 Custom Painting 有关更多信息和工作示例,请开始学习。