【问题标题】:Adding multiple types of Backgrounds to one JFrame向一个 JFrame 添加多种类型的背景
【发布时间】:2013-05-12 09:49:22
【问题描述】:

我的标题有点混乱,所以我会试着解释一下。我想要做的是在我的应用程序中有一个背景图像,它在顶部中心保持静态(例如,在 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) “这是基于此解决方案 - 在 JFrame 中居中 JPanel” 我刚刚回顾了问答并在基础上对接受的答案投了反对票使用null 布局。请参阅this answer 了解使组件居中的最佳方式。 2)为了尽快获得更好的帮助,请发布SSCCE(如链接示例)。
  • 1)。为此,我明白你的意思,我将使用 BorderLayout 方法。 2)。试图获得一个独立的示例将是我如何设置我的项目的地狱......希望我能满足其他要求。感谢您迄今为止的帮助!

标签: java swing background jframe


【解决方案1】:

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

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

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

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

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

【讨论】:

  • 感谢您的帮助!我遇到的问题是我的 JFrame(图像)BoderLayout 已经有一个对象设置为 NORTH,并且所有信息都在 BorderLayout 的中心。我将如何使用您所描述的内容而不会弄乱/将所有数据推送到页面的最底部?
  • 因此,将另一个面板添加到 CENTER 位置,将剩余的组件添加到其中,如所述
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-02-21
  • 1970-01-01
  • 1970-01-01
  • 2020-09-29
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多