java - jPanel 的背景图像不起作用

标签 java image swing jpanel embedded-resource

我是制作 GUI 的新手,所以我决定尝试 eclipse 的 windows 构建器,虽然很棒,但我确实有一些疑问。我一直在搜索,但找不到将背景图像添加到我的“菜单”的好方法。例如我试过这个:

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 包中。

非常感谢。

最佳答案

如果您对调整背景图像大小或应用任何效果不感兴趣,一个简单的方法是使用 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,它们会降低组件的可重用性并将你锁定在一个容器中

关于java - jPanel 的背景图像不起作用,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29637242/

相关文章:

java - Panel.repaint() 似乎没有刷新面板

java - 如何访问自定义线程池执行器方法中的线程对象?

java - 如何传递 BufferedInputStream 或包含 JAX-WS 中其他对象的对象?

Java SE 安全功能可保护用户的应用程序数据

html - 本 map 片在IE中显示但在firefox中不显示?

java - 基于预定义代码构建的 Netbeans GUI

java - "Textfield validation not working properly"

macos - 带有图像的 NSButton

javascript - 图像每 30 秒更改一次 - 循环

java - 是否可以禁用 JSpinner 向下箭头按钮?如何?