gpt4 book ai didi

java - 将带有背景图像的 JPanel 添加到 JFrame 并绘制它

转载 作者:行者123 更新时间:2023-12-01 12:15:17 24 4
gpt4 key购买 nike

我正在使用 GUI 开发一个新的 Java 桌面应用程序,我想添加一个带有背景图像的 JPanel。带有图像的 JLabel 不起作用,因为我将在背景面板顶部添加不同的标签。

所以我想出了这个例子并且我想实现它。

http://www.coderanch.com/how-to/java/BackgroundImageOnJPanel

class BackgroundPanel extends JPanel
{
Image image;
public BackgroundPanel()
{
try
{
image = javax.imageio.ImageIO.read(getClass().getResource("Test.gif"));
}
catch (Exception e) { e.printStackTrace(); /*handled in paintComponent()*/ }
}

@Override
protected void paintComponent(Graphics g)
{
super.paintComponent(g);
if (image != null)
g.drawImage(image, 0,0,this.getWidth(),this.getHeight(),this);
}
}

如何在我的 JFrame 上添加并绘制该面板?我正在尝试将其添加到 mainPanel 但我什至不知道它是否有效。我该如何调用或者在哪里调用 paintComponent 方法?

bgPanel = new BackgroundPanel();
bgPanel.setOpaque(false);
mainPanel.add(bgPanel, new java.awt.GridBagConstraints());

最佳答案

BackgroundPanel 应返回图像的大小作为最小首选大小 (@Override .. getPreferredSize())。如果有组件的话可能会更大( super 尺寸更大)。

A JLabel with an image won't work because I'm going to be adding different labels on top of the background panel.

有趣的是你应该提到这一点。可以(不一定推荐)设置 JLabel 的布局,然后向其中添加其他 JComponent 对象。在任何 JPanel 对象上调用 setOpaque(false) 非常重要,否则 BG 图像将无法显示。

这演示了两种方法。

enter image description here

import java.awt.*;
import java.awt.image.BufferedImage;
import java.net.URL;
import javax.imageio.ImageIO;
import javax.swing.*;
import javax.swing.border.EmptyBorder;

public class BackGroundImage {

private JComponent ui = null;

BackGroundImage() {
initUI();
}

public void initUI() {
if (ui != null) {
return;
}

ui = new JPanel(new GridLayout(0, 1));
ui.setBorder(new EmptyBorder(4, 4, 4, 4));

try {
BufferedImage bi1 = ImageIO.read(
new URL ("/image/OVOg3.jpg"));
BackgroundPanel bp = new BackgroundPanel(bi1);
ui.add(bp);
bp.setLayout(new GridBagLayout());
JLabel l1 = new JLabel("Using BackgroundPanel");
Font f = l1.getFont();
l1.setFont(f.deriveFont(32f));
l1.setForeground(Color.RED);
bp.add(l1);
BufferedImage bi2 = ImageIO.read(
new URL ("/image/lxthA.jpg"));
JLabel l = new JLabel(new ImageIcon(bi2));
ui.add(l);
l.setLayout(new GridBagLayout());
JLabel l2 = new JLabel("Using JLabel");
l2.setFont(f.deriveFont(32f));
l2.setForeground(Color.RED);
l.add(l2);

} catch (Exception e) {
e.printStackTrace();
}
}

public JComponent getUI() {
return ui;
}

public static void main(String[] args) {
Runnable r = new Runnable() {
@Override
public void run() {
BackGroundImage o = new BackGroundImage();

JFrame f = new JFrame("BackgroundPanel");
f.setDefaultCloseOperation(JFrame.DISPOSE_ON_CLOSE);
f.setLocationByPlatform(true);

f.setContentPane(o.getUI());
f.pack();
f.setMinimumSize(f.getSize());

f.setVisible(true);
}
};
SwingUtilities.invokeLater(r);
}
}

class BackgroundPanel extends JPanel {

BufferedImage image;

public BackgroundPanel(BufferedImage image) {
this.image = image;
}

@Override
protected void paintComponent(Graphics g) {
super.paintComponent(g);
g.drawImage(image, 0, 0, this.getWidth(), this.getHeight(), this);
}

@Override
public Dimension getPreferredSize() {
Dimension d = super.getPreferredSize();

int w = d.width > image.getWidth() ? d.width : image.getWidth();
int h = d.height > image.getHeight() ? d.height : image.getHeight();

return new Dimension(w, h);
}
}

关于java - 将带有背景图像的 JPanel 添加到 JFrame 并绘制它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27057872/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com