Проблема:
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);
}
}
JLabels использует нулевую разметку, что означает, что ваши внутренние компоненты JLabel будут иметь размер 0, 0, а сам образ 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, что-то вроде
Image headImage = ImageIO.read(getClass().getResource(resourcePath));
Icon headIcon = new ImageIcon(headImage);
, путь к ресурсу будет критическим и будет зависеть от того, где изображения относительно ваших файлов классов.