我当前正在尝试创建一个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);
}
}
答案 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);
资源路径很关键,并且取决于图像相对于类文件的位置。