【问题标题】:Background image for a jPanel not workingjPanel 的背景图像不起作用
【发布时间】:2014-08-02 06:47:29
【问题描述】:

我是制作 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。希望这可能会有所帮助:-)

标签: java image swing jpanel embedded-resource


【解决方案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 可能会经常被调用并且通常会快速连续调用......

在调整组件大小时让图像缩放是一个完整的问题,对于一些想法,您可以看看...

哦,而且,您应该避免直接从顶级容器扩展,例如 JFrame,它们会降低组件的可重用性并将您锁定在单个容器中

【讨论】:

  • 非常感谢! Windows Builder 提供的生成代码有点乱,我将尝试使用你给我的示例来解决这个问题。
  • @CodeGrasshopper 我希望它有助于澄清一些问题
  • 确实如此,您留下的参考资料将对我将来有很大帮助。再次感谢。
猜你喜欢
  • 1970-01-01
  • 2023-03-03
  • 2016-01-01
  • 2018-05-08
  • 2016-09-27
相关资源
最近更新 更多