有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java设置JPanel的大小,当其中没有组件时

我有一个定制的JPanel。其中唯一的东西是使用Graphics对象的drawRect方法绘制一个矩形。JPanel始终是一个非常特定的正方形大小,拒绝变大或变小。试图重写getPreferredSize()方法,但无效

尝试为此自定义JPanel设置不同的布局管理器,还尝试了承载此JPanel的JPanel的每个布局管理器。不过,定制JPanel的大小保持不变

正如我所说,定制JPanel中没有任何组件,只有一个矩形图形

有什么想法吗


共 (1) 个答案

  1. # 1 楼答案

    在不了解更多你想要实现的目标的情况下:

    • 至于包含面板,您需要知道哪些布局管理器尊重首选尺寸,哪些不尊重

                                Grid     Flow     Border    Box   GridBag
      Respect PreferredSize      NO       YES      NO       YES     YES
      
    • 也就是说,如果你用一个“”NOs“”将绘制的JPanel包裹在一个JPanel中,绘制的JPanel应该随着框架的大小而拉伸

    • 此外,如果希望绘制的矩形与其JPanel一起拉伸,则需要记住使用getWidth()getHeight()JPanel绘制矩形,并且不要使用硬编码值

    下面是一个例子,使用BorderLayout作为包含面板的布局,并在执行绘制时使用getWidth()getHeight()

    enter image description here

    enter image description here

    enter image description here

    import java.awt.*;
    import javax.swing.*;
    
    public class StretchRect {
    
        public StretchRect() {
            JPanel panel = new JPanel(new BorderLayout());
            panel.add(new RectanglePanel());
    
            JFrame frame = new JFrame();
            frame.add(panel);
            frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
            frame.pack();
            frame.setLocationRelativeTo(null);
            frame.setVisible(true);
        }
    
        public class RectanglePanel extends JPanel {
    
            @Override
            protected void paintComponent(Graphics g) {
                super.paintComponent(g);
                g.fillRect( (int)(getWidth() * 0.1), (int)(getHeight() * 0.1), 
                            (int)(getWidth() * 0.8), (int)(getHeight() * 0.8) );
            }
    
            @Override
            public Dimension getPreferredSize() {
                return new Dimension(300, 200);
            }
        }
    
        public static void main(String[] args) {
            SwingUtilities.invokeLater(new Runnable() {
                public void run() {
                    new StretchRect();
                }
            });
        }
    }