如何直接从 Scenebuilder 使用 JavaFX 的 Unicode 字符

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

我使用 JavaFX 和 Scenebuilder 开发应用程序来创建用户界面。我需要在 GUI 上使用 Unicode 字符,但我无法直接从 Scenebuilder 添加它们,这样会更方便。 事实上,Unicode 字符可以很容易地以编程方式插入

myLabel.setText("\u03B1")

但是,由于字符串是完全静态的,我想在 Scenebuilder 中添加文本并避免在 java 代码中注入标签对象,并且只需处理它即可更改文本。

直接在FXML文件中插入Unicode字符串不起作用

<Label fx:id="myLabel" text="\u03B1"/>

我发现的唯一相关帖子是 在 JavaFX 中使用 Unicode 字符,但它并没有解决我的问题。

有没有办法直接在 Scenebuilder 中添加 Unicode 字符,还是我应该放弃这个?

javafx unicode scenebuilder
1个回答
0
投票

在 FXML 中使用 Unicode

如评论中所述,以及相关问题:

此选项有:

  1. 手动编辑 FXML(在 SceneByilder 之外)并使用 XML 转义来转义文本:

    <Label fx:id="myLabel" text="&#x03B1;"/>
    

  1. 将“α”字符作为文本,而不是使用转义序列。

    <Label fx:id="myLabel" text="α"/>
    

  1. 使用此答案中记录的方法通过包含 Unicode 字符的外部属性文件将文本国际化。属性文件中的文本可以直接使用 Unicode 字符,也可以使用
    \u
    unicode 代码序列。

  1. 如果合适,请使用字形库,例如 Ikonli(例如,用于表情符号和其他常见图标)。可以从 SceneBuilder 使用此类库,但如何使用超出了本答案的范围。

使用国际化功能在场景生成器中显示 Unicode 字符

这可以使用资源文件来完成,如《Oracle Scene Builder 用户指南:国际化您的 FXML 布局》中所述。 尽管国际化功能针对国际化应用程序,但它也可用于帮助显示 Unicode 字符,否则很难直接在 SceneBuilder 中输入这些字符。

在 SceneBuilder 中国际化文本。
  1. 选择包含要自定义的文本的节点,然后选择“替换为国际化字符串”。

输入您要使用的资源密钥,在本例中,我使用文本“alpha”。

保存 FXML
  1. 对于保存的 FXML
1

,SceneBuilder 将创建一个像这样的文件,其中资源密钥编码为 %alpha

%
字符表示它是资源键。
<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.Label?>
<?import javafx.scene.layout.StackPane?>
<?import javafx.scene.text.Font?>

<StackPane prefHeight="50.0" prefWidth="100.0" xmlns="http://javafx.com/javafx/19" xmlns:fx="http://javafx.com/fxml/1">
   <children>
      <Label text="%alpha">
         <font>
            <Font size="26.0" />
         </font></Label>
   </children>
</StackPane>

创建包含国际化字符串的属性文件。
src/main/resources/org/example/resourcefx/resources.properties

alpha=\u03B1

如果您需要其他语言和区域设置,您可以为它们添加其他文件,但不仅仅是没有 
_en_US

(或其他)语言和区域设置后缀的默认文件就足够了。


通过预览测试资源。
选择
    Preview | Internationalization | Set Resource...
  • 选择您创建的资源文件。
  • SceneBuilder 现在将显示 Unicode 文本。

在应用程序中使用 FXML 和资源

import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Scene; import javafx.stage.Stage; import java.io.IOException; import java.util.ResourceBundle; public class ResourceApplication extends Application { @Override public void start(Stage stage) throws IOException { FXMLLoader fxmlLoader = new FXMLLoader( ResourceApplication.class.getResource( "resource-view.fxml" ) ); fxmlLoader.setResources( ResourceBundle.getBundle( "org.example.resourcefx.resources" ) ); stage.setScene(new Scene(fxmlLoader.load())); stage.show(); } public static void main(String[] args) { launch(); } }

文件放在哪里

遵循Maven标准目录布局:

. ├── pom.xml └── src └── main ├── java │   ├── module-info.java │   └── org │   └── example │   └── resourcefx │   └── ResourceApplication.java └── resources └── org └── example └── resourcefx ├── resource-view.fxml └── resources.properties

您可以将 
resources.properties

放入任何您想要的包中(或使用未命名的包)。在这里,我对应用程序使用的资源使用了相同的包。这样做还可能有助于避免模块化应用程序中任何潜在的资源解析问题。



通常我会使用外部 CSS 来设置字体,而不是通过 SceneBuilder 直接在 FXML 中设置字体。为了方便演示,我只是在 FXML 中设置了字体。
© www.soinside.com 2019 - 2024. All rights reserved.