我的设置通常有效,但我现在发现它有点痛苦。
我有一个JDialog
(以前是JFrame
,但我最近更改了UI流程以删除多余的JFrames
)设置为BorderLayout,其中包含三个主要{{1} },标题,内容和页脚。
标题JPanels
的背景图片正常加载。但是,我打电话给所有JPanel
/ setMinimumSize
/等等(我甚至试过setPreferredSize
和setSize
绝望)和setBounds
没有正确调整大小。该组件的布局为JPanel
,孩子们可以舒适地坐在其中,但这不应该影响我尝试使用标题面板本身。
唯一有效的方法是在父BoxLayout
上设置尺寸。但我不想这样做/从我所看到的看起来像是糟糕的设计。我还需要计算所有孩子的潜在宽度/高度,添加边距等。
建议我不寻找:"使用其他JDialog
。"
我希望了解是否存在不尊重子组件的原因。
我可以提供代码,但考虑到我操作的互锁系统的数量,隔离一个小的,可运行的段很困难。以下是设置LayoutManager
大小的相关代码段。图像尺寸为480 * 96。
JPanel
答案 0 :(得分:5)
我会以另一种方式实现它 - 确保不能从其他地方更改首选/最小/最大/大小:
public JPanelThemed(BufferedImage image) {
this.backgroundImage = image;
setOpaque(false);
}
public Dimension getPreferredSize() {
return new Dimension(this.backgroundImage.getWidth(), this.backgroundImage.getHeight());
}
答案 1 :(得分:2)
如果我没有定义尺寸,我如何确保显示我正在绘制的整个背景?
您可以使用JLabel显示ImageIcon。标签的大小将是图像的大小。然后,您可以设置标签的布局管理器,以便向其中添加组件。
编辑:
你知道为什么在Java中绘制背景时,通常建议将JPanel子类化
使用JPanel时,面板的大小取决于添加到面板的组件和您正在使用的布局管理器。然后,您的自定义绘画代码需要按照您想要的方式绘制图像。也就是说,您可以从(0,0)绘制图像,或者您可以将图像置于面板中心,您可以缩放图像以使其适合窗格,但图像绝不会控制面板的大小,除非您覆盖面板的{{1}}方法,以使用自定义代码来确定较大组件或图像的大小。所以你完全可以控制。
使用此处建议的JLabel方法时,标签的大小始终是图像的大小。然后组件将基于布局管理器定位,但如果图像小于组件所需的空间,则可以截断组件。
因此,根据您的要求,您要确保显示整个图像,我建议使用JLabel方法,因为您不需要编写任何自定义代码。我发现这是一个简单的方法,当使用弹出不可调整大小的对话框来显示背景图像和一些组件和按钮来关闭对话框时。
您还可以查看Background Panel,它在可重复使用的课程中提供这些常见的绘画功能。