Как использовать объект FontAwesomeIconView в качестве значка рабочей области? - PullRequest
0 голосов
/ 08 ноября 2018

Я использую FontAwesomeFX для многих значков в моем приложении. Я хотел бы использовать их как значки для моего Stage.

Поскольку FontAwesomeIconView расширяет GlyphIcon, что расширяет Text, я не могу использовать его как Image напрямую.

Есть ли способ создать годный к употреблению Image из Text объекта?

Я пытался использовать snapshot, но я не знаком с этим методом и в итоге получаю стандартный «пустой» значок на моей сцене.

Вот MCVE, который у меня есть:

import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView;
import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class FontAwesomeIconExample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        // Simple Interface
        VBox root = new VBox(10);
        root.setAlignment(Pos.CENTER);
        root.setPadding(new Insets(10));

        // Convert the FontAwesomeIconView node to an Image
        FontAwesomeIconView iconView = new FontAwesomeIconView(FontAwesomeIcon.ID_CARD_ALT);
        WritableImage icon = iconView.snapshot(new SnapshotParameters(), null);

        primaryStage.getIcons().add(icon);

        // Show the stage
        primaryStage.setWidth(300);
        primaryStage.setHeight(100);
        primaryStage.setScene(new Scene(root));
        primaryStage.setTitle("Sample");
        primaryStage.show();
    }
}

И результат:

screenshot


Можно ли использовать снимок узла в качестве значка сцены? Или есть лучший способ преобразования FontAwesomeIconView для этой цели?

EDIT:

Я испробовал методы как Седрика, так и Дж. Костикиадиса, и оба дали мне одинаковые результаты.


Sedrick-х:

    // Convert the FontAwesomeIconView node to an Image
    FontAwesomeIconView iconView = new FontAwesomeIconView(FontAwesomeIcon.AMAZON);
    WritableImage icon = iconView.snapshot(new SnapshotParameters(), null);
    java.awt.image.BufferedImage bImage = SwingFXUtils.fromFXImage(icon, null);
    ByteArrayOutputStream s = new ByteArrayOutputStream();
    try {
        javax.imageio.ImageIO.write(bImage, "png", s);
    } catch (IOException e) {
        e.printStackTrace();
    }

screenshot


JKostikiadis годы:

    FontAwesomeIconView iconView = new FontAwesomeIconView(FontAwesomeIcon.AMAZON);
    WritableImage writableImg = iconView.snapshot(null, null);
    Image img = SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(writableImg, null), null);
    primaryStage.getIcons().add(img);

screenshot


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

Что я сейчас не понимаю, так это значок, который он создает для меня, а не для них ...

Я использую Windows 7 и JDK 1.8.0_161.

Ответы [ 2 ]

0 голосов
/ 08 ноября 2018

В дополнение к ответу Седрика, другое (более короткое) решение может заключаться в том, чтобы просто создать изображение (пакет javafx) и добавить к нему значки сцены:

FontAwesomeIconView iconView = new FontAwesomeIconView(FontAwesomeIcon.AMAZON);
WritableImage writableImg = iconView.snapshot(null, null);
Image img = SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(writableImg, null), null);
primaryStage.getIcons().add(img);

P.S. Относительный пост можно найти здесь: Снимок изображения нельзя использовать в качестве значка сцены

Редактировать

По некоторым причинам, версия 8.15 FontawesomeFx требует, чтобы FontAwesomeIconView был добавлен в сцену для инициализации его содержимого, что не нужно делать в самой новой версии FontawesomeFx. Поэтому, на мой взгляд, вам нужно либо обновить версию FontawesomeFx, либо добавить FontAwesomeIconView на сцену, а затем сделать снимок. Как это:

FontAwesomeIconView iconView = new FontAwesomeIconView(FontAwesomeIcon.ID_CARD_ALT);
Scene scene = new Scene(new StackPane(iconView));
WritableImage writableImg = iconView.snapshot(null, null);
Image img = SwingFXUtils.toFXImage(SwingFXUtils.fromFXImage(writableImg, null), null);

Вот результат (в версии 8.5):

enter image description here

0 голосов
/ 08 ноября 2018

Я только что понял это. Цель состоит в том, чтобы получить InputStream. Я смог сделать это, используя SwingFXUtils.fromFXImage(icon, null);, чтобы получить bufferedImage. Оттуда я использовал ImageIO.write(bImage, "png", s);, чтобы получить byte array. Я привык byte array, чтобы получить InputStream.

import de.jensd.fx.glyphs.fontawesome.FontAwesomeIcon;
import de.jensd.fx.glyphs.fontawesome.FontAwesomeIconView;
import java.awt.image.BufferedImage;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.util.logging.Level;
import java.util.logging.Logger;
import javafx.application.Application;
import javafx.embed.swing.SwingFXUtils;
import javafx.geometry.Insets;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.image.Image;
import javafx.scene.image.WritableImage;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javax.imageio.ImageIO;

public class FontAwesomeIconExample extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage primaryStage) {

        try {
            // Simple Interface
            VBox root = new VBox(10);
            root.setAlignment(Pos.CENTER);
            root.setPadding(new Insets(10));

            // Convert the FontAwesomeIconView node to an Image
            FontAwesomeIconView iconView = new FontAwesomeIconView(FontAwesomeIcon.AMAZON);
            WritableImage icon = iconView.snapshot(new SnapshotParameters(), null);
            BufferedImage bImage = SwingFXUtils.fromFXImage(icon, null);
            ByteArrayOutputStream s = new ByteArrayOutputStream();
            ImageIO.write(bImage, "png", s);
            InputStream is = new ByteArrayInputStream(s.toByteArray());

            primaryStage.getIcons().add(new Image(is, 16, 16, false, false));

            // Show the stage
            primaryStage.setWidth(300);
            primaryStage.setHeight(100);
            primaryStage.setScene(new Scene(root));
            primaryStage.setTitle("Sample");
            primaryStage.show();
        } catch (IOException ex) {
            Logger.getLogger(FontAwesomeIconExample.class.getName()).log(Level.SEVERE, null, ex);
        }
    }    
}

enter image description here enter image description here

Это стоит отметить в javadoc.

Изображения должны быть разных размеров одного и того же изображения, и будет выбран лучший размер, например. 16x16, 32x32.

...