我的标题有点令人困惑,所以我会尽力解释一下。我想要做的是在我的应用程序中有一个背景图像,该背景图像在顶部中心保持静态(例如,x 轴中心,y 轴顶部)。即使 JFrame 的大小被调整,我也想要这个。然而,在该图像下方,我希望我制作的图案能够重复足够多以适合窗口尺寸。
我想了几种方法来做到这一点(并使用了已经回答的 StackOverflow 问题)来想出一个合乎逻辑的解决方案。 (我说合乎逻辑是因为它实际上不起作用。)
我会用这个 -
JPanel panel = new JPanel();
panel.getContentPane(backgroundImage);
panel.setSize(400, 400); // JFrame arbitrary size.
panel.getContentPane().setLayout(null);
panel.setVisible(true);
int panelX = (panel.getWidth() - panel.getWidth() - panel.getInsets().left - panel.getInsets().right) / 2;
panel.setLocation(panelX, 0);
这是基于此解决方案 - Center a JPanel in a JFrame
这段代码的问题是,当我尝试使用 getContentPane(); 时出现错误。 (错误是“JPanel 类型未定义 getContentPane() 方法”。)
在该 JPanel 下方,我将有另一个包含以下代码的 JPanel -
BufferedImage titledImageFile = ImageIO.read(new File(IMAGE_PATH_TILED));
TiledImage test = new TiledImage(tiledImageFile);
public void paintComponent(Graphics g) {
int width = getWidth();
int height = getHeight();
int imageW = tileImage.getWidth(this);
int imageH = tileImage.getHeight(this);
// Tile the image to fill our area.
for (int x = 0; x < width; x += imageW) {
for (int y = 0; y < height; y += imageH) {
g.drawImage(tileImage, x, y, this);
}
}
}
希望我的问题很清楚; 我是否以正确的方式处理这个问题,或者我还应该做些什么?另外,我如何让 JFrame 与此一起工作?
最后,如果这个问题被否决,请留下解释,以便我可以修复/防止它将来发生。
最佳答案
您需要将每个面板构建在彼此之上
从 JFrame
开始,使用 BorderLayout
,将 TitledPane
添加到其中。这将允许标题 Pane 占据框架的整个空间。
将 TitledPane
的布局设置为 GridBagLayout
。使用以下约束,添加一个 JLabel
,其图标属性已设置为您的图像...
GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTH;
如果您将标题结果缓存到单独的 BufferedImage
中,速度也会更快。每次面板失效
时,您都需要更新它,但它会提供更快的重绘...
关于java - 向一个 JFrame 添加多种类型的背景,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16605442/