直接在“javafx.scene.Canvas”内绘制FontIcon(Ikonli)

问题描述 投票:0回答:1

如何直接在“javafx.scene.Canvas”版本kordamp 12.3.1中绘制FontIcon(Ikonli)https://github.com/kordamp/ikonli

右侧包含画布,左侧的图标应出现。 我认为必须有另一种方法来做到这一点,也许获取 svg,但仍在使用 Ikonli 我不知道如何做到这一点

Image Ikonli canvas

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;
 
import javafx.scene.image.Image;
 
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;

import javafx.stage.Stage;

import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid;
import org.kordamp.ikonli.javafx.FontIcon;
 

public class IkonliCanvas extends Application {
   
    
    
    @Override
    public void start(Stage primaryStage) {
        // Criar um Canvas
        Canvas canvas = new Canvas(100, 400 );
        GraphicsContext gc = canvas.getGraphicsContext2D();        
        
        Pane pcanvas = new Pane();
        pcanvas.getChildren().add(canvas); 
        
        FontIcon fi = new FontIcon(FontAwesomeSolid.APPLE_ALT);      
        fi.setIconSize(30);
    
        Image snapshot = fi.snapshot(new SnapshotParameters(), null);       
        gc.drawImage(snapshot, 40,100);
        
        
        Pane p = new Pane();
        p.getChildren().add(fi);
        p.setPrefWidth(100);        
        fi.setLayoutX(40);
        fi.setLayoutY(100); 
        
        BorderPane bp = new BorderPane();
        bp.setLeft(p);
        bp.setCenter(pcanvas);
             
        Scene scene = new Scene(bp, 220,400);
    
        primaryStage.setScene(scene);
        primaryStage.setTitle("Canvas Ikonli");
        primaryStage.show();
    }
 
    public static void main(String[] args) {
        launch(args);
    }
    
}

这样结果显示不正确

javafx
1个回答
1
投票

文档中所述,

Node
必须是场景的一部分才能使快照正常工作。

在您的演示代码中,

FontIcon
被添加到场景中(作为
BorderPane
的一部分),因此如果您在创建场景后拍摄快照,它会按预期工作:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;

import javafx.scene.image.Image;

import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;

import javafx.stage.Stage;

import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid;
import org.kordamp.ikonli.javafx.FontIcon;


public class IkonliCanvas extends Application {



    @Override
    public void start(Stage primaryStage) {
        // Criar um Canvas
        Canvas canvas = new Canvas(100, 400 );
        GraphicsContext gc = canvas.getGraphicsContext2D();

        Pane pcanvas = new Pane();
        pcanvas.getChildren().add(canvas);

        FontIcon fi = new FontIcon(FontAwesomeSolid.APPLE_ALT);
        fi.setIconSize(30);


        Pane p = new Pane();
        p.getChildren().add(fi);
        p.setPrefWidth(100);
        fi.setLayoutX(40);
        fi.setLayoutY(100);

        BorderPane bp = new BorderPane();
        bp.setLeft(p);
        bp.setCenter(pcanvas);

        Scene scene = new Scene(bp, 220,400);

        Image snapshot = fi.snapshot(new SnapshotParameters(), null);
        gc.drawImage(snapshot, 40,100);


        primaryStage.setScene(scene);
        primaryStage.setTitle("Canvas Ikonli");
        primaryStage.show();
    }

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

}

如果您实际上并未将图标添加到实际应用程序中的“真实”场景中,则可以创建一个虚拟场景来保存它。这是一个仅显示绘制在画布上的图标的版本:


import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.canvas.Canvas;
import javafx.scene.canvas.GraphicsContext;

import javafx.scene.image.Image;

import javafx.scene.layout.BorderPane;
import javafx.scene.layout.Pane;

import javafx.stage.Stage;

import org.kordamp.ikonli.fontawesome5.FontAwesomeSolid;
import org.kordamp.ikonli.javafx.FontIcon;


public class IkonliCanvas extends Application {

    private final Pane dummyPane = new Pane();
    private final Scene dummyScene = new Scene(dummyPane);

    @Override
    public void start(Stage primaryStage) {
        // Criar um Canvas
        Canvas canvas = new Canvas(100, 400 );
        GraphicsContext gc = canvas.getGraphicsContext2D();

        Pane pcanvas = new Pane();
        pcanvas.getChildren().add(canvas);

        FontIcon fi = new FontIcon(FontAwesomeSolid.APPLE_ALT);
        fi.setIconSize(30);

        Image snapshot = snapshotIcon(fi);
        gc.drawImage(snapshot, 40,100);


        BorderPane bp = new BorderPane();
        bp.setCenter(pcanvas);

        Scene scene = new Scene(bp, 220,400);

        primaryStage.setScene(scene);
        primaryStage.setTitle("Canvas Ikonli");
        primaryStage.show();
    }

    private Image snapshotIcon(FontIcon icon) {
        dummyPane.getChildren().add(icon);
        Image snapshot = icon.snapshot(new SnapshotParameters(), null);
        dummyPane.getChildren().remove(icon);
        return snapshot;
    }

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

}

© www.soinside.com 2019 - 2024. All rights reserved.