如何直接在“javafx.scene.Canvas”版本kordamp 12.3.1中绘制FontIcon(Ikonli)https://github.com/kordamp/ikonli
右侧包含画布,左侧的图标应出现。 我认为必须有另一种方法来做到这一点,也许获取 svg,但仍在使用 Ikonli 我不知道如何做到这一点
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);
}
}
这样结果显示不正确
如文档中所述,
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);
}
}