Проблема с загрузкой и отображением изображения - PullRequest
0 голосов
/ 13 февраля 2019

Я создал программу на Java, которая загружает изображение из интернета, дает ссылку и сохраняет его в определенную папку на моем компьютере после нажатия кнопки в графическом интерфейсе.Далее я хочу отобразить это изображение на экране.Обратите внимание, что ввод URL-адреса - это не обязательно URL-адрес самого изображения, а HTML-страница, содержащая изображение.Проблема в том, что я не могу просто создать объект ImageIcon с упреждением, потому что файл изображения еще не существует в системе еще во время компиляции.

Класс панели

public class AdditionPanel extends JPanel
{

    // ...
    static JTextPane textpane;
    JLabel paneInstructions;
    JButton linkOk;

    public AdditionPanel() throws IOException
    {

        textpane = new JTextPane();         
        paneInstructions = new JLabel("Paste the link here:");
        linkOk = new JButton(" OK ");

        // ...

        linkOk.addActionListener(new LinkOkPressed());

        // ...

        this.add(textpane);
        this.add(paneInstructions);
        this.add(linkOk);
    }
}

У меня была идея создать ActionListener для этой кнопки и попытаться получить доступ к файлу только после нажатия кнопки, и, таким образом, файл был загружен.В этом случае я не знаю, как сделать изображение на JPanel из другого класса.

Слушатель действий

public class LinkOkPressed implements ActionListener
{
    JLabel test;
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // ImageDownloader is a class I have created, that simply saves the image
        // from the given URL in a predetermined directory
        ImageDownloader.saveImage(ImageDownloader.getImageUrl(AdditionPanel.textpane.getText()));
        ImageIcon poster = new ImageIcon(getClass().getResource("/resources/myimage.png"));
        test= new JLabel(poster);
        AdditionPanel.add(test); // Does not work
    }

}

Итак, можноЯ добавляю изображение на панель из другого класса, или есть лучший способ получить доступ к файлу, который загружается во время выполнения приложения?Спасибо за помощь.

ImageDownloader

public class ImageDownloader
{
    public static String getImageUrl(String imdbLink)
    {
        String imageLink = "";
        try
        {
            Document doc = Jsoup.connect(imdbLink).get();
            Elements divs = doc.getElementsByClass("poster");
            Element poster = divs.first();
            Elements image = poster.getElementsByTag("a");
            Element downloadImage = image.first();
            Elements img = downloadImage.getElementsByTag("img");
            imageLink = img.attr("src");
        }
        catch (IOException e)
        {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }

        return imageLink;
    }


    public static void saveImage(String imageLink)
    {
        BufferedImage image = null;
        try
        {
            URL url =new URL(imageLink);
            image = ImageIO.read(url);
            ImageIO.write(image, "png", new File("C:\\...\\resources\\myimage.png"));
        }
        catch(IOException e)
        {
            e.printStackTrace();
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 13 февраля 2019

SwingWorker пример.

Создайте отдельный класс следующим образом ...

public class SaveImage extends javax.swing.SwingWorker<Void, Void> {
    private AdditionPanel additionPanel;

    public SaveImage(AdditionPanel addPanel) {
        additionPanel = addPanel;
    }

    @Override
    protected Void doInBackground() throws Exception {
        ImageDownloader.saveImage(ImageDownloader.getImageUrl(AdditionPanel.textpane.getText()));
        // Wait until the image is saved.
        // Since I don't have code for class "ImageDownloader", can't tell you how to do this.
        return null;
    }

    @Override
    protected void done() {
        javax.swing.ImageIcon poster = new javax.swing.ImageIcon(getClass().getResource("/resources/myimage.png"));
        javax.swing.JLabel test= new javax.swing.JLabel(poster);
        additionPanel.add(test);
    }
}

И измените свой класс LinkOkPressed следующим образом ...

public class LinkOkPressed implements ActionListener
{
    @Override
    public void actionPerformed(ActionEvent e)
    {
        Object obj = e.getSource(); // "obj" is really "linkOk" from class "AdditionPanel"
        java.awt.Container parent = ((JButton) obj).getParent(); // "parent" is instance of "AdditionPanel"
        SaveImage saveImage = new SaveImage((AdditionPanel) parent);
        saveImage.execute();
    }
}
0 голосов
/ 13 февраля 2019

Разработка комментария PM 77-1 .

public class LinkOkPressed implements ActionListener
{
    JLabel test;
    @Override
    public void actionPerformed(ActionEvent e)
    {
        // ImageDownloader is a class I have created, that simply saves the image
        // from the given URL in a predetermined directory
        ImageDownloader.saveImage(ImageDownloader.getImageUrl(AdditionPanel.textpane.getText()));
        ImageIcon poster = new ImageIcon(getClass().getResource("/resources/myimage.png"));
        test= new JLabel(poster);
        Object obj = e.getSource(); // "obj" is really "linkOk" from class "AdditionPanel"
        java.awt.Container parent = ((JButton) obj).getParent(); // "parent" is instance of "AdditionPanel"
        ((JPanel) parent).add(test);
    }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...