0

这让我一整天都发疯了,所以我想我会把它贴在这里,看看其他人是否能解决这个问题。首先,我尝试添加背景图像,默认的 ImageIcon 不起作用,所以我改用了覆盖 paint 方法。#

public class ImageJPanel extends JPanel { 
private static final long serialVersionUID = -1846386687175836809L;
Image image = null; 

public ImageJPanel(){ 
    addComponentListener(new ComponentAdapter() { 
    public void componentResized(ComponentEvent e) { 
        ImageJPanel.this.repaint(); 
    } 
}); 
}
//Set the image.
public ImageJPanel(Image i) { 
  image=i; 
  setOpaque(false); 
} 
//Overide the paint component.
public void paint(Graphics g) { 
  if (image!=null) g.drawImage(image, 0, 0, null); 
  super.paint(g); 
} 

}

一旦我使用它就可以正常工作,但是现在我想将图像添加到我的按钮中,但它不起作用。这是我的按钮的工作原理:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
Images images = new Images();
JPanel j = new ImageJPanel(images.menuBackground); 
j.setLayout(null);
JButton Button_1= new JButton("Button_1",new ImageIcon("images/gui/Button.png"));

Insets insets = j.getInsets();
Dimension size = Button_1.getPreferredSize();
Button_1.setBounds(300 + insets.left, 150+ insets.top, size.width, size.height);

Singleplayer.setSize(200, 50);

j.add(Button_1);

frame.add(j);
frame.setSize(800,600);
frame.setResizable(false);
Button_1.addMouseListener(singleplayerPressed);

frame.setVisible(true);

我所有的图像都是.png,这会影响它吗?

4

2 回答 2

2

让我们从这个开始:

public void paint(Graphics g) { 
    if (image!=null) g.drawImage(image, 0, 0, null); 
    super.paint(g); 
} 

这是错误的做法。首先,你真的不想重写paint方法,除非你绝对知道这是解决你的问题的正确方法(并且不知道更多,我建议它不是)。

其次,您在组件上绘制图像,然后立即在其顶部绘制......(super.paint(g);可以在您的作品上绘制,我知道面板是不透明的,但这仍然是一个非常糟糕的方法)。

paintComponent改为使用

protected void paintComponent(Graphics g) { 
    super.paint(g); 
    if (image!=null) g.drawImage(image, 0, 0, null); 
} 

PNG 图像很好,Swing 开箱即用地支持它们。

确保您的程序可以看到图像。它是从文件源加载的还是 JAR 中的资源?

试试这个:

System.out.println(new File("images/gui/Button.png").exits());

如果您的程序可以看到该文件,它将返回,否则true程序看不到该文件,那是您的问题。

于 2012-07-24T23:51:31.673 回答
2

试试这个:

ImageIcon image = new ImageIcon(this.getClass()
                .getResource("images/gui/Button.png"));

Side note, you should override paintComponent() not paint(). Also make sure to call super implementation before doing all your painting. For more details see Lesson: Performing Custom Painting tutorial.

于 2012-07-24T23:53:04.243 回答