Как нарисовать javax.swing.ImageIcon в визуализированном пользовательском интерфейсе JavaFX .f xml? - PullRequest
0 голосов
/ 05 мая 2020

Я разрабатываю полнофункциональный клиент JavaFX , который использует устаревшие поставщики ресурсов. Одним из таких предоставленных ресурсов является javax.swing.ImageIcon. Мне нужно нарисовать этот значок внутри диалогового окна с деталями, которое отображается из файла JavaFX .f xml.

Я обнаружил, что для работы нужно нарисовать ImageIcon в java.awt.image.BufferedImage с помощью ImageIcon.paintIcon() метод с java.awt.Graphics из BufferedImage.createGraphics(). Исходя из этого BufferedImage, javafx.embed.swing.SwingFXUtils.toFXImage() дает javafx.scene.image.WritableImage, который может быть помещен в ImageView файла .f xml.

Вот код метода преобразования, основанный на другом решения, рассматриваемые здесь, в StackOverflow:

private javafx.scene.image.Image atonIcon2ImageConverter(ImageIcon icon) {
    BufferedImage bi = new BufferedImage(
            icon.getIconWidth(),
            icon.getIconHeight(),
            BufferedImage.TYPE_INT_RGB);

    Graphics g = bi.createGraphics();
    // paint the Icon to the BufferedImage.
    icon.paintIcon(null, g, 0, 0);
    g.dispose();
    return SwingFXUtils.toFXImage(bi.getSubimage(0, 1, bi.getWidth(), bi.getHeight()-1), null);
}

Хотя это решение работает, оно кажется мне довольно запутанным, и мне хотелось бы получить мнение экспертов о том, как его можно сделать более простым. Поскольку JavaFX является преемником Swing, я считаю вполне возможным, что существует более простой способ разместить Swing ImageIcon внутри файла JavaFX .f xml (дается ImageIcon, но ImageView можно оспорить. ).

Изменить: мое решение.

После экспериментов и смешивания различных комментариев и решений, вот что я получил для моей реальной реализации системы. Это определенно очень специфическая среда (ImageIcon имеет внутри Swing ToolkitImage), поэтому она может быть неприменима ко многим:

private javafx.scene.image.Image atonIcon2ImageConverter(ImageIcon icon) {
    BufferedImage bi = ((sun.awt.image.ToolkitImage)imageIcon.getImage()).getBufferedImage();
    return SwingFXUtils.toFXImage(bi, null);
}

1 Ответ

1 голос
/ 06 мая 2020

Пробовали ли вы:

ImageIcon imageIcon;
Image image = imageIcon.getImage();
BufferedImage bufferedImage = (BufferedImage) image;

или комбинированные

BufferedImage bufferedImage = (BufferedImage) imageIcon.getImage();

Работает это или нет, зависит от того, как ImageIcons сконструированы в вашем устаревшем коде. Вот рабочий пример. Он также содержит закомментированный вариант, который не работает.

import java.awt.image.BufferedImage;
import java.io.IOException;

import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class ImageIconTest {

    public static void main(String[] args) throws IOException {
        ImageIcon imageIcon = createImageIcon("/DukeCheers.png", "DukeCheers");

        BufferedImage bufferedImage = (BufferedImage)imageIcon.getImage();

        System.out.println("done");
    }

    private static ImageIcon createImageIcon(String path, String description) throws IOException {
        java.net.URL imgURL = ImageIconTest.class.getResource(path);
        if (imgURL != null) {

            // This does not work.
            // return new ImageIcon(imgURL, description);

            // This works.
            return new ImageIcon(ImageIO.read(imgURL), description);

        } else {
            System.err.println("Couldn't find file: " + path);
            return null;
        }
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...