【问题标题】:Set size of JPanel, when there are no components in it设置 JPanel 的大小,当其中没有组件时
【发布时间】:2014-03-04 08:26:26
【问题描述】:

我有一个自定义的 JPanel。其中唯一的内容是使用Graphics 对象的drawRect 方法绘制一个矩形。 JPanel 总是在一个非常具体的正方形大小,拒绝变得更大或更小。尝试覆盖getPreferredSize() 方法,无效。

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

正如我所说,自定义 JPanel 中没有组件,只有一个矩形的绘图。

有什么想法吗?

【问题讨论】:

  • 你试过JPanel的setSize方法吗?
  • 试试这样 jpanel.setPreferredSize(new Dimension(640, 480)); ??
  • 大小取决于使用的布局管理器。 (将它放在 GridLayout 中,它将与其余组件的大小相同)。因此,如果不了解布局的其余部分,就不可能知道问题出在哪里。
  • 您是否试图通过调整框架大小来使矩形/面板拉伸?
  • 为了尽快获得更好的帮助,请发布MCTaRE(经过测试和可读的最小完整示例)。

标签: java swing jpanel preferredsize


【解决方案1】:

在不了解您想要实现的目标的情况下:

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

                              Grid     Flow     Border    Box   GridBag
    Respect PreferredSize      NO       YES      NO       YES     YES
    
  • 话虽如此,如果您将绘制的JPanel 包裹在一个带有 “NO” 的 JPanel 中,绘制的 JPanel 应该随着框架。

  • 此外,如果您希望绘制的矩形与它的JPanel 一起拉伸,那么您需要记住使用getWidth() 和getHeight() 绘制矩形,而不是使用硬编码值.

这是一个使用BorderLayout作为包含面板布局的示例,并在执行绘画时使用getWidth()和getHeight()。

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

【讨论】:

猜你喜欢
  • 2014-04-29
  • 1970-01-01
  • 2014-03-15
  • 1970-01-01
  • 1970-01-01
  • 2014-06-09
  • 1970-01-01
  • 2013-08-15
  • 2012-09-01
相关资源
最近更新 更多