JavaFX中的彩色图标字体

JavaFX中的彩色图标字体,java,fonts,javafx,Java,Fonts,Javafx,我有一个JavaFX应用程序,我想在其中使用一些图标。目前,我解析了所有可能有图标的文本,其中包含一个特定字符串a字符,例如“:icon:”,并构建了TextFlow,在其中我用图像替换匹配的关键字。然后我只是在标签/TextField/等中将TextFlow显示为一个图形。这让我感觉非常草率。有更好的解决办法吗 我想使用一种自定义字体,用我想使用的少量图标替换一些unicode字符,但图标中必须有颜色。这是可以用字体完成的吗?我可以使用CSS给文本的特定字符上色吗?我在这条路上走对了吗?您可能

我有一个JavaFX应用程序,我想在其中使用一些图标。目前,我解析了所有可能有图标的文本,其中包含一个特定字符串a字符,例如“:icon:”,并构建了TextFlow,在其中我用图像替换匹配的关键字。然后我只是在标签/TextField/等中将TextFlow显示为一个图形。这让我感觉非常草率。有更好的解决办法吗


我想使用一种自定义字体,用我想使用的少量图标替换一些unicode字符,但图标中必须有颜色。这是可以用字体完成的吗?我可以使用CSS给文本的特定字符上色吗?我在这条路上走对了吗?

您可能希望使用web字体

此示例使用

对于一个快速示例,我内联了样式,但是对于一个“真实”的应用程序,您可能会使用一个外部CSS样式表和有意义的常量名称来表示您希望包含的图标图示符的unicode代码点

进一步资源


如果您在网上搜索其他类似的资源,例如,和。

TextFlow是正确的方法。我不确定TrueType字体是否可以呈现多种颜色,但即使可以,在运行时生成这样的字体也将非常困难。至于你的另一个问题:文本是形状的一个子类,所以它可以应用CSS,包括。只需为不同颜色的字符创建一个单独的文本对象。尽管如此,我发现工具提示、标签等东西的大小不合适,因为它们与图形一起使用。也许这是我的文本流生成器中的一个缺陷。这看起来很有希望,我会看看我能用它做些什么!
import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.text.Text;
import javafx.scene.text.TextFlow;
import javafx.stage.Stage;

public class MixedTextAndIconFonts extends Application {
    @Override public void start(Stage stage) {
        Text i = new Text("I");
        Text love = new Text("\uE87D");
        Text u = new Text("you");
        i.setStyle("-fx-font-family: \'Indie Flower\'; -fx-font-size: 80; -fx-fill: forestgreen;");
        love.setStyle("-fx-font-family: \'Material Icons\'; -fx-font-size: 60; -fx-fill: firebrick;");
        u.setStyle("-fx-font-family: \'Indie Flower\'; -fx-font-size: 80; -fx-fill: forestgreen;");

        TextFlow textFlow = new TextFlow(
                i,
                love,
                u
        );
        textFlow.setStyle("-fx-padding: 20px; -fx-background-color: azure;");

        Scene scene = new Scene(textFlow);
        scene.getStylesheets().add("http://fonts.googleapis.com/css?family=Indie+Flower");
        scene.getStylesheets().add("http://fonts.googleapis.com/css?family=Material+Icons");
        stage.setScene(scene);
        stage.show();
    }

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