JDialog 不考虑 child 组件的尺寸

JDialog doesn't respect dimensions of child components

我有一个通常有效的设置,但我现在发现它有点麻烦。

我有一个 JDialog(以前是 JFrame,但我最近更改了 UI 流程以删除多余的 JFrames)设置为 BorderLayout,其中包含三个主要 JPanels、header、内容和页脚。

header JPanel 的背景图片加载正常。但是,我正在调用各种 setMinimumSize / setPreferredSize / 等(我什至尝试 setSizesetBounds 出于绝望)并且 JPanel 不是'尺寸不正确。该组件的布局是 BoxLayout,children 舒适地坐在其中,但这不应该影响我尝试使用 header 面板本身做的事情。

唯一有效的方法是在 parent JDialog 上设置大小。但我不想这样做/从我读过的内容来看,这似乎是糟糕的设计。我还必须计算出所有 children 的潜在宽度/高度,添加边距等

建议我不是寻找:"use a different LayoutManager."

想要了解child组件未被遵守是否有原因。

我可以提供代码,但考虑到我正在处理的互锁系统数量,很难隔离一个小的、可运行的段。这是设置 JPanel 大小的相关片段。图片尺寸为480 * 96.

public JPanelThemed(BufferedImage image) {
    super();
    this.backgroundImage = image;
    setAllSimilarConstraints(new Dimension(image.getWidth(), image.getHeight()));
    setOpaque(false);
}

// for use with BoxLayout as it requires explicit bounds to be set
public void setAllSimilarConstraints(Dimension dim) {
    setPreferredSize(dim);
    setMinimumSize(dim);
    setMaximumSize(dim);
}

我会以另一种方式实现它 - 以确保 preferred/min/max/Size 不能从其他地方更改:

public JPanelThemed(BufferedImage image) {
    this.backgroundImage = image;
    setOpaque(false);
}

public Dimension getPreferredSize() {
    return new Dimension(this.backgroundImage.getWidth(), this.backgroundImage.getHeight());
}

If I don't define dimensions, how do I ensure the whole background I'm painting is displayed?

您可以使用 JLabel 来显示 ImageIcon。标签的大小将是图像的大小。然后设置标签的布局管理器,以便向其添加组件。

编辑:

do you know why it's commonly-recommended to subclass JPanel when painting backgrounds in Java

当您使用 JPanel 时,面板的大小取决于添加到面板的组件和您使用的布局管理器。然后,您的自定义绘画代码需要按照您想要的方式绘制图像。也就是说,您可以从 (0, 0) 绘制图像,或者可以将图像居中放置在面板上,可以缩放图像以使其适合窗格,但图像绝不会控制面板的大小,除非您覆盖面板的 getPreferredSize() 方法以使用自定义代码来确定组件或图像中较大者的大小。所以你完全可以控制。

当您使用此处建议的 JLabel 方法时,标签的大小始终是图像的大小。然后组件将根据布局管理器定位,但如果图像小于组件所需的space,则可能会被截断。

因此,根据您希望确保显示整个图像的要求,我建议使用 JLabel 方法,因为您不需要编写任何自定义代码。当使用弹出式不可调整大小的对话框显示背景图像和一些组件和按钮关闭对话框时,我发现这是一种简单的方法。

您还可以查看 Background Panel,它在可重复使用的 class.

中提供了这些常见的绘画功能