JLabel не будет отображать изображение в классе - PullRequest
0 голосов
/ 12 октября 2019

В настоящее время я пытаюсь создать графический интерфейс, в котором два изображения монет отображаются рядом друг с другом в центре бордюра. У меня есть один класс (Изображения), в котором я пытаюсь использовать JLabel для отображения значков, а другой класс, который обрабатывает GUI Frame (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 Ответ

3 голосов
/ 12 октября 2019

Проблема:

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);

, путь к ресурсу будет критическим и будет зависеть от того, где изображения относительно ваших файлов классов.

...