将多种类型的背景添加到一个JFrame

时间:2013-05-17 09:13:34

标签: java swing background jframe

我的头衔有点令人困惑,所以我会试着解释一下。我想要做的是在我的应用程序中有一个背景图像,它在顶部中心保持静止(如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()时出现错误; (错误是“方法getContentPane()未定义类型JPanel”。)

在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使用它?

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

1 个答案:

答案 0 :(得分:1)

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

JFrame开始,使用BorderLayout向您添加TitledPane。这将使标题窗格占据框架的整个空间。

TitledPane的布局设置为GridBagLayout。使用以下约束,添加JLabel,其图标属性已设置为您的图像...

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

如果将标题的结果缓存到单独的BufferedImage,它也会更快。每次面板invalidated时,您都需要更新它,但它会提供更快的重绘...