Java 自定义JButton子类setIcon方法不工作

Java 自定义JButton子类setIcon方法不工作,java,swing,jbutton,embedded-resource,imageicon,Java,Swing,Jbutton,Embedded Resource,Imageicon,编辑:这是一个Netbeans项目。 所以我创建了JButton的一个子类Card。我试图在创建按钮上设置一个图标 package matchinggame; public class Card extends JButton { final static ImageIcon defaultIcon = new ImageIcon("cardback.jpg"); ... public Card(int secretIconIndex) { //

编辑:这是一个Netbeans项目。 所以我创建了JButton的一个子类Card。我试图在创建按钮上设置一个图标

package matchinggame;

public class Card extends JButton {

    final static ImageIcon defaultIcon = new ImageIcon("cardback.jpg");

    ...

    public Card(int secretIconIndex) { 
        //Set the button's icon to the default icon
        setIcon(defaultIcon);
        ... 
    }

    ...

}
如果您想知道,“cardback.jpg”图像的位置是:

C:\Users\Jesse\SkyDrive\Documents\RCS\Grade 12\ICS4U\M9\MatchingGame\src\matchinggame\cardback.jpg
它与所有类都在同一个文件夹/包中,因此我相信我可以像这样保留相对文件路径。当我运行程序时,所有的按钮都是空白的(没有文本或图标)。这是构造函数问题还是文件路径问题

如果使用“eclipse”,则图像必须位于文件夹“src”内才能使用绝对路径。 用法:
new File(“cardback.jpg”).exists()//要查看文件是否位于正确的位置

如果使用“eclipse”,则图像必须位于文件夹“src”中才能使用绝对路径。 用法:

new File(“cardback.jpg”).exists()//查看文件是否位于正确位置

如果这是一个Eclipse项目,请将图像存储在
src/
文件夹中的
resources/
文件夹中

setButtonIcon("cardback.jpg");

public void setButtonIcon(String filename) {
  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  InputStream input = classLoader.getResourceAsStream("/"+filename);
  ImageIcon icon = new ImageIcon(ImageIO.read(input));
  super.setIcon(icon);
}

如果这是一个Eclipse项目,请将图像存储在
src/
文件夹中的
resources/
文件夹中

setButtonIcon("cardback.jpg");

public void setButtonIcon(String filename) {
  ClassLoader classLoader = Thread.currentThread().getContextClassLoader();
  InputStream input = classLoader.getResourceAsStream("/"+filename);
  ImageIcon icon = new ImageIcon(ImageIO.read(input));
  super.setIcon(icon);
}

我的问题在问题评论中得到了回答。brano88和满是鳗鱼的气垫船据说使用资源而不是文件路径。以下操作修复了我的问题:

final ImageIcon defaultIcon = new ImageIcon(getClass().getResource("/resources/cardback.jpg"));
我把这个放在我的卡片课上


注意:我将图像移动到Eclipse的“src”文件夹或Netbeans的“Source Packages”文件夹中的新“resources”包中。

我的问题在问题注释中得到了回答。brano88和满是鳗鱼的气垫船据说使用资源而不是文件路径。以下操作修复了我的问题:

final ImageIcon defaultIcon = new ImageIcon(getClass().getResource("/resources/cardback.jpg"));
我把这个放在我的卡片课上


注意:我将图像移动到Eclipse的“src”文件夹或Netbeans的“Source Packages”文件夹中的一个新的“resources”包中。

您尝试过使用绝对路径吗?是的,我会看到错误的路径。您是否使用了调试器、println语句或记录器来检查此时的程序状态,以查看图标是否为空(例如),问题出在filepath中。据我所知,您已经在项目中创建了名为
matchinggame
的包,并在该包中添加了图标。如果是这样,您应该像这样设置图标:setIcon(newimageicon(getClass().getResource(“/matchinggame/cardback.jpg”));使用资源,而不是文件,因为您可能希望在某个时候使用jar。谢谢大家!我将所有图像放在一个“resources”包中,并创建了ImageIcon:
final ImageIcon defaultIcon=new ImageIcon(getClass().getResource(“/resources/cardback.jpg”)matchinggame
的包,并在该包中添加了图标。如果是这样,您应该像这样设置图标:setIcon(newimageicon(getClass().getResource(“/matchinggame/cardback.jpg”));使用资源,而不是文件,因为您可能希望在某个时候使用jar。谢谢大家!我将所有图像放在一个“resources”包中,并创建了ImageIcon:
final ImageIcon defaultIcon=new ImageIcon(getClass().getResource(“/resources/cardback.jpg”)
我喜欢使用
ImageIO
但是你可以简单地使用
ImageIO.read(getClass().getResource(“/matchinggame/cardback.jpg”);
并得到相同的结果;)我喜欢使用
ImageIO
但你可以简单地使用
ImageIO.read(getClass().getResource(“/matchinggame/cardback.jpg”);
并得到相同的结果;)