Java 向一个JFrame添加多种类型的背景

Java 向一个JFrame添加多种类型的背景,java,swing,background,jframe,Java,Swing,Background,Jframe,我的标题有点混乱,所以我会尽力解释。我想做的是在我的应用程序中有一个背景图像,它在顶部中心保持静止(例如,在x轴上居中,在y轴的正上方)。即使JFrame重新调整了大小,我也希望这样。然而,在这张图片的下面,我希望我制作的图案能够足够重复以适应窗口的大小 我想出了几种方法(并使用了已经回答过的StackOverflow问题)来提出一个合乎逻辑的解决方案。(我说逻辑是因为它实际上不起作用。) 我会用这个- JPanel panel = new JPanel(); panel.getConte

我的标题有点混乱,所以我会尽力解释。我想做的是在我的应用程序中有一个背景图像,它在顶部中心保持静止(例如,在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);
这是基于以下的解决方案-

这段代码的问题是,当我尝试使用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);
    }
}
}
buffereImage titledImageFile=ImageIO.read(新文件(图像路径平铺));
TiledImage测试=新的TiledImage(tiledImageFile);
公共组件(图形g){
int width=getWidth();
int height=getHeight();
int-imageW=tileImage.getWidth(这个);
int-imageH=tileImage.getHeight(这个);
//平铺图像以填充我们的区域。
对于(int x=0;x
希望我的问题很清楚; 我这样做是正确的,还是我应该做些别的事情?此外,如何让JFrame与此一起工作


最后,如果这个问题被否决,请留下一个解释,以便我可以修复/防止它在将来发生。

您需要将每个面板构建在彼此之上

从您的
JFrame
开始,使用
BorderLayout
,将您的
标题窗格添加到其中。这将允许标题窗格占据框架的整个空间

标题窗格的布局设置为
GridBagLayout
。使用以下约束,添加一个
JLabel
,其图标属性已设置为您的图像

GridBagConstraints gbc = new GridBagConstraints();
gbc.weightx = 1;
gbc.weighty = 1;
gbc.anchor = GridBagConstraints.NORTH;

如果将标题的结果缓存到一个单独的
buffereImage
,也会更快。每次面板失效时,您都需要更新它,但它将提供更快的重新绘制…

1)“这是基于此解决方案-JFrame中的JPanel中心”我刚刚回顾了Q&a&down在使用
null
布局的基础上投票通过了可接受的答案。有关使零部件居中的最佳方法,请参见。2) 为了更快地获得更好的帮助,请发布一个(如链接的示例)。1)。为此,我理解你的意思,我将使用BorderLayout方法。2). 试图得到一个自我包含的例子将是地狱般的我如何设置我的项目。。。希望我能满足其他要求。谢谢你迄今为止的帮助!谢谢你的帮助!我遇到的问题是,我已经为我的JFrame(图像)BoderLayout将一个对象设置为NORTH,所有信息都在BorderLayout的中心。我如何使用您所描述的内容而不弄乱它/将所有数据推到页面的最底部?因此,添加另一个面板到中间位置,将剩余的组件添加到其中,如所述