Java Swing JLabel.setIcon () работает не так, как я ожидаю - PullRequest
0 голосов
/ 08 апреля 2020

У меня, вероятно, легко решаемая проблема. Я использовал Intellij Idea для создания формы GUI. Теперь я пытаюсь изменить imageIcon для imageLabel JLabel.

Я не совсем понимаю, почему, но когда я использую JLabel.setIcon (), он не выдает исключение и не отображает изображение. Я понятия не имею, что с ним не так. Это похоже на очень простую команду.

(я добавил ico.getImage (). Flu sh (); строка, потому что, когда я искал вокруг, люди говорили, что вы должны грипп sh изображение перед его отображением. На самом деле я не знаю что делает эта строка.)

Спасибо за любую помощь.

public class App
{
    private JPanel mainPanel;
    private JPanel imagePanel;
    private JPanel optionsPanel;
    private JPanel palletesPanel;
    private JPanel buttonsPanel;
    private JPanel originalPalletePanel;
    private JPanel newPalletePanel;
    private JLabel originalPalleteLabel;
    private JLabel newPalleteLabel;
    private JPanel leftButtonsPanel;
    private JPanel rightButtonsPanel;
    private JButton previewButton;
    private JButton revertButton;
    private JButton convertImageButton;
    private JButton matchPalleteButton;
    private JLabel originalPalleteImageLabel;
    private JLabel newPalleteImageLabel;
    private JLabel imageLabel;

    public static void main(String[] args)
    {
        App app = new App();
        JFrame frame = new JFrame("Pixel Pigeon");
        frame.setContentPane(new App().mainPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        pigeon pigey = new pigeon();
        try
        {
            app.loadImage(frame, app);
        }
        catch(java.io.IOException e)
        {
            e.printStackTrace();
        }

    }

    private void loadImage(JFrame frame, App app) throws IOException
    {
        JFileChooser chooser = new JFileChooser();
        if(chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION)
        {
            BufferedImage img = ImageIO.read(chooser.getSelectedFile());
            ImageIcon ico = new ImageIcon(img);
            ico.getImage().flush();
            app.imageLabel.setIcon(ico);
        }
    }

}

1 Ответ

2 голосов
/ 08 апреля 2020

Было много проблем с этим коротким фрагментом кода. После удаления множества избыточных компонентов ссылка на класс отсутствует, исправлены два экземпляра NullPointerException, удален вызов flu sh образа и устранена проблема с новым созданием App(), которое уже существует, это «работает». Но все равно это так плохо, что я бы рекомендовал отказаться от всего этого и начать заново со ссылкой на JavaDocs для изучения того, что рекомендуют случайные люди, и Java Учебное пособие по основам GUI разработки.

Итак, вот «фиксированный» код: он загрузит изображение, но затем необходимо растянуть GUI, чтобы сделать изображение видимым.

import java.awt.image.BufferedImage;
import java.io.*;
import javax.swing.*;
import javax.imageio.ImageIO;

public class App {
    private JPanel mainPanel = new JPanel();
    private JLabel imageLabel = new JLabel();

    public static void main(String[] args) {
        App app = new App();
        JFrame frame = new JFrame("Pixel Pigeon");
        app.mainPanel.add(app.imageLabel);
        frame.setContentPane(app.mainPanel);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.pack();
        frame.setVisible(true);
        try {
            app.loadImage(frame, app);
        }
        catch(java.io.IOException e) {
            e.printStackTrace();
        }
    }

    private void loadImage(JFrame frame, App app) throws IOException {
        JFileChooser chooser = new JFileChooser();
        if(chooser.showOpenDialog(frame) == JFileChooser.APPROVE_OPTION) {
            BufferedImage img = ImageIO.read(chooser.getSelectedFile());
            ImageIcon ico = new ImageIcon(img);
            app.imageLabel.setIcon(ico);
        }
    }
}
...