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 的背景图像不起作用的主要内容,如果未能解决你的问题,请参考以下文章

为啥我的 SVG 背景图像不起作用?

为啥背景图像的 ng-style 不起作用?

Reactjs - div的背景图像不起作用

使用 url() 方法时背景图像不起作用?

iOS导航视图背景图像UIViewContentModeScaleAspectFill不起作用

背景图像过渡在CSS中不起作用[重复]