JLabel不会在课堂上显示图像

时间:2019-10-12 13:06:59

标签: java swing jframe awt jlabel

我当前正在尝试创建一个GUI,在该GUI中,两个硬币的图像在borderlayout的中心彼此相邻显示。我有一个尝试使用JLabel显示图标的类(图像),另一个处理GUI框架(GameGUI)。但是,尽管我尽了最大努力,这些标签仍无法显示图像。我浏览了无数的教程,找不到任何解决方法。相对路径正确,我该如何解决?

图片类

public class Images extends JLabel{

    private JLabel heads, tails;

    public Images() {
        heads = new JLabel(new ImageIcon("img/heads.png"));
        tails = new JLabel(new ImageIcon("img/tails.png"));
        add(heads);
        add(tails);
    }
}

GameGUI类

public class GameGUI extends JFrame{

    public GameGUI() {
        super("");
        setLayout(new BorderLayout(10,10));

        Menu menu = new Menu();
        ToolBar toolBar = new ToolBar();
        Images images = new Images();

        setJMenuBar(menu);

        add(BorderLayout.NORTH, toolBar);
        add(BorderLayout.CENTER, images);

        setSize(1000, 500);
        setLocationRelativeTo(null);
        setVisible(true);
        setDefaultCloseOperation(WindowConstants.EXIT_ON_CLOSE);
    }
}

1 个答案:

答案 0 :(得分:3)

问题:

public class Images extends JLabel{

    private JLabel heads, tails;

    public Images() {
        heads = new JLabel(new ImageIcon("img/heads.png"));
        tails = new JLabel(new ImageIcon("img/tails.png"));
        add(heads);
        add(tails);
    }
}

JLabel使用null布局,这意味着内部JLabel组件的大小将为0、0,而Images JLabel本身的首选大小将为相同,并且不会显示任何内容,因此您永远不想添加一个JLabel到JLabel。没有图像扩展JLabel,而是扩展JPanel,并为其提供适当的布局,也许是GridLayout。

例如

public class ImagePanel extends JPanel {
    private JLabel headsLabel = new JLabel();
    private JLabel tailsLabel = new JLabel();

    public ImagePanel(Icon headsIcon, Icon tailsIcon) {
        headsLabel.setIcon(headsIcon);
        tailsLabel.setIcon(tailsIcon);
        setLayout(new GridLayout(1, 0);
        add(headsLabel);
        add(tailsLabel);
    }       
}

同样,我建议将图像作为资源,而不是像使用ImageIO read的文件那样获得

Image headImage = ImageIO.read(getClass().getResource(resourcePath));
Icon headIcon = new ImageIcon(headImage);

资源路径很关键,并且取决于图像相对于类文件的位置。