有 Java 编程相关的问题?

你可以在下面搜索框中键入要查询的问题!

java在一个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()时出错; (错误是“类型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与此配合使用

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


共 (1) 个答案

  1. # 1 楼答案

    你需要把每个面板叠在一起

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

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

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

    如果将标题的结果缓存到一个单独的BufferedImage,速度也会更快。您需要在每次面板被invalidated时更新它,但它将提供更快的重新绘制