Java ImageIcon和按钮上的图像问题-JFrame

Java ImageIcon和按钮上的图像问题-JFrame,java,image,swing,jframe,embedded-resource,Java,Image,Swing,Jframe,Embedded Resource,这一整天都让我发疯,所以我想我应该把它贴在这里,看看是否有人能解决它。首先,我尝试添加背景图像,默认的ImageIcon不起作用,因此我改为覆盖paint方法# } 曾经我用过,它工作得很好,但现在我想添加图像到我的按钮,但它不工作。以下是我的按钮的工作原理: frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); Images images = new Images(); JPanel j = new ImageJPanel(images.m

这一整天都让我发疯,所以我想我应该把它贴在这里,看看是否有人能解决它。首先,我尝试添加背景图像,默认的ImageIcon不起作用,因此我改为覆盖paint方法#

}

曾经我用过,它工作得很好,但现在我想添加图像到我的按钮,但它不工作。以下是我的按钮的工作原理:

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,这会影响它吗?

让我们从以下内容开始:

public void paint(Graphics g) { 
    if (image!=null) g.drawImage(image, 0, 0, null); 
    super.paint(g); 
} 
这是错误的做法。首先,除非您绝对知道这是解决问题的正确方法,否则您真的不想覆盖绘制方法(在不知道更多的情况下,我建议它不是)

其次,在组件上绘制图像,然后立即在其顶部绘制…(
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
,否则程序无法看到该文件,这就是您的问题。

让我们从以下内容开始:

public void paint(Graphics g) { 
    if (image!=null) g.drawImage(image, 0, 0, null); 
    super.paint(g); 
} 
这是错误的做法。首先,除非您绝对知道这是解决问题的正确方法,否则您真的不想覆盖绘制方法(在不知道更多的情况下,我建议它不是)

其次,在组件上绘制图像,然后立即在其顶部绘制…(
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
,否则程序无法看到该文件,这就是您的问题。

尝试以下操作:

ImageIcon image = new ImageIcon(this.getClass()
                .getResource("images/gui/Button.png"));
旁注,您应该覆盖
paintComponent()
而不是
paint()
。在进行所有绘制之前,请确保调用
super
implementation。有关更多详细信息,请参阅教程。

尝试以下方法:

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

旁注,您应该覆盖
paintComponent()
而不是
paint()
。在进行所有绘制之前,请确保调用
super
implementation。有关更多详细信息,请参阅教程。

图像位于何处?PNG工作得很好。旁注,您应该覆盖
paintComponent()
而不是
paint()
。在进行所有绘制之前,还要确保调用
super
实现。1)对于
JPanel
覆盖
paintComponent(Graphics)
,而不是
paint(Graphics)
2)使用
Class.getResource(String)
定位图像等应用程序资源(代码提供了一个
字符串
,该字符串将被解释为
文件
路径。3)为了更快地获得更好的帮助,请发布一篇文章。4)请学习类、方法和属性名称的通用(特别是用于名称的大小写)并一致使用。图像位于何处?PNG工作得很好。旁注,您应该覆盖
paintComponent()
而不是
paint()
。在进行所有绘制之前,还要确保调用
super
实现。1)对于
JPanel
覆盖
paintComponent(Graphics)
,而不是
paint(Graphics)
2)使用
Class.getResource(String)
定位图像等应用程序资源(代码提供了一个
字符串
,该字符串将被解释为
文件
路径。3)为了更快地获得更好的帮助,请发布一篇文章。4)请学习类、方法和属性名称的通用(特别是用于名称的大小写),并一致使用它。
g.drawImage(image,0,0,null)
最好是
g.drawImage(image,0,0,this);//每个JComponent都是ImageObserver啊!非常感谢你!这解决了问题!图像放错地方了。@AndrewThompson复制'n'粘贴+1,总是让我提心吊胆;)<代码>g.drawImage(图像,0,0,null)
最好是
g.drawImage(image,0,0,this);//每个JComponent都是ImageObserver啊!非常感谢你!这解决了问题!图像放错地方了。@AndrewThompson复制'n'粘贴+1,总是让我提心吊胆;)