Cómo utilizar un objeto FontAwesomeIconView como el icono de un escenario?

votos
3

Estoy usando FontAwesomeFX para muchos iconos a lo largo de mi solicitud. Me gustaría utilizarlos como iconos para mi Stagetambién.

Desde FontAwesomeIconViewextiende GlyphIcon, que se extiende Text, no puedo usarlo como una Imagedirectamente.

¿Hay una manera de crear un útil Imagede un Textobjeto?

He tratado de usar snapshot, pero no estoy familiarizado con ese método y terminar con el icono estándar vacío en mi etapa.

Aquí está el MCVE que tengo hasta ahora:

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

Y el resultado:

captura


¿Es posible utilizar una instantánea nodo como un icono de escenario? ¿O hay un mejor método para convertir el FontAwesomeIconViewpara este fin?

EDITAR:

He probado ambos métodos de Sedrick y JKostikiadis de ambos y dar resultados similares para mí.


Sedrick de:

    // 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();
    }

captura


JKostikiadis de:

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

captura


Creo que ambos cumplen esencialmente la misma cosa (con el tamaño de la Imageque resulta en diferentes iconos que aparecen).

Lo que no entiendo ahora, por lo que este es el icono que está produciendo para mí y no les ...

Estoy corriendo Windows 7 y JDK 1.8.0_161.

Publicado el 07/11/2018 a las 22:29
fuente por usuario
En otros idiomas...                            


2 respuestas

votos
3

Me lo imaginé. El objetivo es conseguir una InputStream. Yo era capaz de hacer que el uso SwingFXUtils.fromFXImage(icon, null);de conseguir un BufferedImage. A partir de ahí he utilizado ImageIO.write(bImage, "png", s);para obtener una byte array. Solía byte arraytener una 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);
        }
    }    
}

introducir descripción de la imagen aquí introducir descripción de la imagen aquí

Esto es digno de mención desde el javadoc.

Las imágenes deben ser de diferentes tamaños de la misma imagen y serán elegidos el mejor tamaño, por ejemplo. 16x16, 32x32.

Respondida el 08/11/2018 a las 02:15
fuente por usuario

votos
2

Además de la respuesta de Sedrick, otra solución (más corto) podría ser simplemente crear una imagen (paquete javafx) y añadirlo etapa iconos:

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

PS Un puesto relativa podría encontrar aquí: instantánea de la imagen no se puede utilizar como icono de la etapa

Editar :

Por alguna razón, la versión 8.15 del FontawesomeFx requiere la FontAwesomeIconView que se añade en una escena con el fin de inicializar su contenido, algo que no es necesario hacer en la nueva versión de FontawesomeFx. Por lo tanto, en mi opinión, usted tiene que o bien actualizar su versión FontawesomeFx o para agregar la FontAwesomeIconView en una escena y después de tomar la instantánea. Me gusta esto :

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

Aquí está el resultado (usando la versión 8.5):

introducir descripción de la imagen aquí

Respondida el 08/11/2018 a las 02:44
fuente por usuario

Cookies help us deliver our services. By using our services, you agree to our use of cookies. Learn more