我使用 JavaFX 和 Scenebuilder 开发应用程序来创建用户界面。我需要在 GUI 上使用 Unicode 字符,但我无法直接从 Scenebuilder 添加它们,这样会更方便。 事实上,Unicode 字符可以很容易地以编程方式插入
myLabel.setText("\u03B1")
但是,由于字符串是完全静态的,我想在 Scenebuilder 中添加文本并避免在 java 代码中注入标签对象,并且只需处理它即可更改文本。
直接在FXML文件中插入Unicode字符串不起作用
<Label fx:id="myLabel" text="\u03B1"/>
我发现的唯一相关帖子是 在 JavaFX 中使用 Unicode 字符,但它并没有解决我的问题。
有没有办法直接在 Scenebuilder 中添加 Unicode 字符,还是我应该放弃这个?
如评论中所述,以及相关问题:
此选项有:
手动编辑 FXML(在 SceneByilder 之外)并使用 XML 转义来转义文本:
<Label fx:id="myLabel" text="α"/>
或
将“α”字符作为文本,而不是使用转义序列。
<Label fx:id="myLabel" text="α"/>
或
\u
unicode 代码序列。或
这可以使用资源文件来完成,如《Oracle Scene Builder 用户指南:国际化您的 FXML 布局》中所述。 尽管国际化功能针对国际化应用程序,但它也可用于帮助显示 Unicode 字符,否则很难直接在 SceneBuilder 中输入这些字符。
在 SceneBuilder 中国际化文本。
输入您要使用的资源密钥,在本例中,我使用文本“alpha”。
保存 FXML,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>
创建包含国际化字符串的属性文件。
alpha=\u03B1
如果您需要其他语言和区域设置,您可以为它们添加其他文件,但不仅仅是没有
_en_US
(或其他)语言和区域设置后缀的默认文件就足够了。
通过预览测试资源。Preview | Internationalization | Set Resource...
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
放入任何您想要的包中(或使用未命名的包)。在这里,我对应用程序使用的资源使用了相同的包。这样做还可能有助于避免模块化应用程序中任何潜在的资源解析问题。