
本文旨在解决javafx应用程序在使用jpackage打包成独立可执行文件后,日期格式化中的本地化信息(如星期名称)丢失的问题。尽管代码中明确设置了locale,但打包后的应用可能默认不包含完整的本地化数据。核心解决方案是在jpackage命令中显式添加`jdk.localedata`模块,以确保所有必要的语言环境数据都被包含在最终的安装包中。
JavaFX应用日期本地化在打包后失效
许多JavaFX开发者在IDE中运行应用程序时,会发现日期和时间格式化功能(例如,使用DateTimeFormatter结合Locale来显示特定语言的星期名称)能够正常工作。然而,当使用jpackage工具将应用打包成独立的可执行文件(如.exe)后,这些本地化信息可能会意外地变回默认的英文显示,即使代码中已明确指定了非英文的Locale。这通常体现在TableCell中日期列的显示上,例如,期望显示西班牙语的星期名称,却最终显示为英文。
核心问题与原因分析
这种现象的根本原因在于jpackage在创建自包含应用程序时,为了减小包体积,默认情况下不会包含所有JDK的本地化数据。java.time包(及其DateTimeFormatter)在进行本地化格式化时,需要依赖这些特定的语言环境数据。当这些数据缺失时,系统会回退到默认的语言环境(通常是英文),导致日期中的星期名称等本地化元素显示不正确。
立即学习“Java免费学习笔记(深入)”;
为了确保应用程序能够正确地处理多种语言环境的日期和时间格式,需要显式地将包含这些本地化数据的jdk.localedata模块添加到打包过程中。
jpackage命令的优化
解决此问题的关键在于修改jpackage命令,显式地引入jdk.localedata模块。该模块包含了JDK支持的所有语言环境数据,确保DateTimeFormatter能够根据指定的Locale正确地进行本地化处理。
原始的jpackage命令示例:
jpackage --type exe --input . --dest . --main-jar .\Dulceria.jar --main-class com.example.dulceria.HelloApplication --module-path "D:\Program Files\Java\javafx-jmods-18" --add-modules javafx.controls,javafx.fxml,java.sql,java.sql.rowset --win-shortcut --win-menu
修改后的jpackage命令,增加了jdk.localedata模块:
jpackage --type exe --input . --dest . --main-jar .\Dulceria.jar --main-class com.example.dulceria.HelloApplication --module-path "D:\Program Files\Java\javafx-jmods-18" --add-modules javafx.controls,javafx.fxml,java.sql,java.sql.rowset,jdk.localedata --win-shortcut --win-menu
通过在--add-modules参数中加入jdk.localedata,jpackage会将其包含在最终的运行时镜像中,从而解决本地化数据缺失的问题。
JavaFX日期格式化代码示例
以下是JavaFX应用程序中用于设置日期列本地化格式的代码片段,它展示了如何明确指定Locale来格式化日期:
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
public class DateFormatterExample {
// 假设 Col_FEentrega 和 Col_Hora_entrega 是 TableColumn<YourDataType, LocalDate> 和 TableColumn<YourDataType, LocalTime>
private TableColumn<Object, LocalDate> Col_FEentrega;
private TableColumn<Object, LocalTime> Col_Hora_entrega;
public void initializeColumns() { // 假设这是一个初始化方法
// 初始化TableColumn,这里仅作示例
Col_FEentrega = new TableColumn<>("交付日期");
Col_Hora_entrega = new TableColumn<>("交付时间");
Formato_fecha_y_hora();
}
public void Formato_fecha_y_hora(){
// 设置日期列的本地化格式
Locale locale = new Locale("es", "ES"); // 指定西班牙语(西班牙)Locale
DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy E").withLocale(locale);
Col_FEentrega.setCellFactory(tc -> new TableCell<>() {
@Override
protected void updateItem(LocalDate date, boolean empty) {
super.updateItem(date, empty);
if (empty) {
setText(null);
} else {
setText(formatter.format(date));
}
}
});
// 设置时间列的格式(通常时间格式不受jdk.localedata影响,但此处一并展示)
DateTimeFormatter formato_hora = DateTimeFormatter.ofPattern("h:mm a");
Col_Hora_entrega.setCellFactory(tc -> new TableCell<>() {
@Override
protected void updateItem(LocalTime Time, boolean empty) {
super.updateItem(Time, empty);
if (empty) {
setText(null);
} else {
setText(formato_hora.format(Time));
}
}
});
}
}这段代码确保了在应用程序内部,日期格式化器会尝试使用指定的Locale。结合前面修改后的jpackage命令,打包后的应用程序将能够正确地加载并应用这些本地化数据。
重要提示
结论
通过在jpackage命令中添加jdk.localedata模块,可以有效解决JavaFX应用程序在打包后日期本地化信息丢失的问题。这确保了自包含应用程序能够访问完整的语言环境数据,从而在不同地区和语言设置下提供一致且正确的用户体验。在开发和部署JavaFX桌面应用时,理解并正确配置jpackage的模块依赖是实现健壮本地化功能的关键一步。
以上就是JavaFX应用使用jpackage打包后日期本地化失效的解决方案的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号