java - 根据内容调整框架大小

标签 java swing jpanel size pack

我需要设置 JPanel 的首选大小,以便 JFrame 组件的 pack() 方法正常工作。如何自动设置此尺寸?我有一个带有 GridLayout 3x3 的 JPanel,里面装满了 9 个 ImagePanel:

public class ImagePanel extends JPanel {
    private Image image;

    public ImagePanel(Image image) {
        this.image = image;
        setSize(image.getWidth(null), image.getHeight(null));
    }

    public void paintComponent(Graphics g) {
        super.paintComponent(g);

        g.drawImage(image, 0, 0, null);
    }
}

现在我想做的是获取这个 JPanel 图像的大小。

image.getWidth() * 3
image.getHeight() * 3

不是我想要的。我宁愿想知道类似于 pack() 的东西。

最佳答案

最简单的方法是让图像确定组件的首选大小,如下所示:

public class ImagePanel extends JPanel {
    private Image image;

    public ImagePanel(Image image) {
        this.image = image;
        // setSize(image.getWidth(null), image.getHeight(null));
    }

    @Override
    public Dimension getPreferredSize() {
        if (image != null) {
            int w = image.getWidth();
            int h = image.getHeight();
            return new Dimension(w, h);
        } else {
            return super.getPreferredSize();
        }
    }

    @Override   // this should be protected, not public
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        if (image != null) {
            g.drawImage(image, 0, 0, null);
        }
    }
}

关于java - 根据内容调整框架大小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/36367943/

相关文章:

java - jbuttons 仅在我将鼠标悬停在它们上方后显示

java - 使用 Netflix Feign 传递数据流

Java 字节缓冲区到 C

java - 在 JPanel 上绘制多个 JComponent 不起作用

java - 不知道为什么我无法让 addMouseListener(this())、addMouseMotionListener(this()) 工作

java - JPanel重绘不起作用

java - 将Java SWT/AWT桥嵌入winform形式

java - Java中类似构造函数的语句来调用super

java - JProgress Bar 未在 SwingWorker 内更新

java - 将滚动条添加到 JTabbedPane 内的 JTextPane?