jPanel 的背景图像不起作用
Posted
技术标签:
【中文标题】jPanel 的背景图像不起作用【英文标题】:Background image for a jPanel not working 【发布时间】:2015-06-20 15:32:22 【问题描述】:我是制作 GUI 的新手,所以我决定尝试 eclipse 的 windows builder,虽然很棒,但我确实有一些疑问。我一直在搜索,但找不到将背景图像添加到“菜单”的好方法。例如我试过这个:
public Menu()
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(50, 50, 300, 250); //Dimensiones
contentPane = new JPanel() //Imagen de Fondo
public void paintComponent(Graphics g)
Image img = Toolkit.getDefaultToolkit().getImage(
Menu.class.getResource("/imgs/rotom.jpg"));
g.drawImage(img, 0, 0, this.getWidth(), this.getHeight(), this);
;
并添加以下类:
import java.awt.Graphics;
import java.awt.Image;
import java.awt.Toolkit;
但无济于事,窗口仍然保持其暗灰色,到目前为止,我的代码只是 WindowsBuilder 为您烹制的标准代码加上 4 个按钮,但我怀疑它们在这里是否重要。我添加的代码不应该覆盖 jPanel 的 paintComponent() 方法并在其中绘制图像吗?
菜单的类在我的项目中的一个包中,图像在一个 imgs 包中,也在同一个项目中。
非常感谢。
【问题讨论】:
不要尝试在paint方法中加载资源。将它们作为类属性加载并简单地在paint中绘制它们。 @AndrewThompson 对不起,我说我对此很陌生,你认为你可以给我一个例子吗? 我也推荐使用ImageIO.read(URL)
来加载图片,因为它提供了更多失败的反馈。
“你觉得你能给我举个例子吗?”你觉得你能付钱给我吗? SO 是一个问答网站,而不是代码生成工厂。
@CodeGrasshopper:请看看如何add images to Eclipse Project。希望这可能会有所帮助:-)
【参考方案1】:
如果您对调整背景图像的大小或应用任何效果不感兴趣,一个简单的方法是使用JLabel
...
BufferedImage bg = ImageIO.read(Menu.class.getResource("/imgs/rotom.jpg"));
JLabel label = new JLabel(new ImageIcon(bg));
setContentPane(label);
setLayout(...);
这种方法有一些限制(除了缩放),因为标签的首选大小将始终是图像的大小,并且从不考虑它的内容。这有好有坏。
您似乎正在使用的另一种方法是使用专门的组件
public class BackgroundPane extends JPanel
private BufferedImage img;
public BackgroundPane(BufferedImage img)
this.img = img;
@Override
public Dimension getPreferredSize()
return img == null ? super.getPreferredSize() : new Dimension(img.getWidth(), img.getHeight());
@Override
protected void paintComponent(Graphics g)
super.paintComponent(g);
g.drawImage(img, 0, 0, this);
您应该避免尝试在 paintComponent
方法中执行任何可能需要时间才能完成的任务,因为 paintComponent
可能会经常被调用并且通常会快速连续调用......
在调整组件大小时让图像缩放是一个完整的问题,对于一些想法,您可以看看...
Java: maintaining aspect ratio of JPanel background image Java: JPanel background not scaling Quality of Image after resize very low -- Java Reading/Loading images哦,而且,您应该避免直接从***容器扩展,例如 JFrame
,它们会降低组件的可重用性并将您锁定在单个容器中
【讨论】:
非常感谢! Windows Builder 提供的生成代码有点乱,我将尝试使用你给我的示例来解决这个问题。 @CodeGrasshopper 我希望它有助于澄清一些问题 确实如此,您留下的参考资料将对我将来有很大帮助。再次感谢。以上是关于jPanel 的背景图像不起作用的主要内容,如果未能解决你的问题,请参考以下文章