
本文旨在解决javafx应用程序在使用jpackage打包成可执行文件(如.exe)后,日期格式化中星期几的名称未能正确显示为指定语言(如西班牙语),反而显示为英文的问题。核心原因是jpackage默认创建的运行时环境缺少`jdk.localedata`模块,该模块包含了丰富的本地化数据。通过在jpackage命令中显式添加`jdk.localedata`模块,可以确保应用程序在打包后也能正确地进行多语言日期格式化。
在开发JavaFX应用程序时,我们经常需要处理多语言和本地化日期格式的需求。Java 8及更高版本提供了强大的java.time包(JSR 310),其中DateTimeFormatter结合Locale可以轻松实现日期和时间的本地化显示。然而,当使用jpackage工具将JavaFX应用程序打包成独立的桌面应用程序(如Windows下的.exe文件)时,开发者可能会遇到一个常见问题:即使在代码中明确设置了特定的Locale,打包后的应用程序在显示日期(特别是星期几的名称)时,仍然会默认显示为英文,而不是预期的语言。
假设您有一个JavaFX应用程序,其表格列中需要显示日期,并且希望星期几的名称以西班牙语显示。在IDE中运行应用程序时,一切正常,日期如15/05/2024 Miércoles(星期三)所示。但是,当您使用jpackage命令将其打包成.exe文件并在目标机器上运行时,同一日期却显示为15/05/2024 Wed。
以下是实现日期格式化的关键代码片段:
import java.time.LocalDate;
import java.time.LocalTime;
import java.time.format.DateTimeFormatter;
import java.util.Locale;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
public class DateFormatterExampleController {
// 假设Col_FEentrega是一个TableColumn<YourDataType, LocalDate>
private TableColumn<YourDataType, LocalDate> Col_FEentrega;
// 假设Col_Hora_entrega是一个TableColumn<YourDataType, LocalTime>
private TableColumn<YourDataType, LocalTime> Col_Hora_entrega;
public void Formato_fecha_y_hora() {
// 设置西班牙语区域(西班牙)
Locale locale = new Locale("es", "ES");
// 定义日期格式,包含两位日、两位月、四位年,以及星期几的缩写 (E)
// .withLocale(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));
}
}
});
// ----------------- 时间格式化(与核心问题关联较小,可根据实际情况保留或简化) -----------------
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));
}
}
});
// -------------------------------------------------------------------------------------
}
}用于打包的jpackage命令如下:
立即学习“Java免费学习笔记(深入)”;
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的工作方式。jpackage工具在创建应用程序的运行时映像时,默认会尽可能地精简,只包含应用程序直接依赖的模块。java.time.format.DateTimeFormatter在进行本地化格式化时,特别是需要获取特定语言的星期几或月份名称时,依赖于Java运行时环境中的本地化数据。这些数据通常封装在jdk.localedata模块中。
当在IDE中运行时,应用程序使用的是完整的JDK,其中包含了jdk.localedata模块及其所有的本地化数据。因此,DateTimeFormatter可以正确地根据Locale("es", "ES")获取并显示西班牙语的星期几名称。
然而,在上述jpackage命令中,我们只显式添加了javafx.controls, javafx.fxml, java.sql, java.sql.rowset等模块。jdk.localedata模块并未被包含在内。因此,打包后的应用程序运行时,由于缺少必要的本地化数据,DateTimeFormatter无法找到西班牙语的星期几名称,便会回退到默认的英文显示。
解决此问题的关键是确保在jpackage命令中显式包含jdk.localedata模块。通过添加此模块,jpackage会在生成的运行时映像中包含所有必要的本地化数据,从而使DateTimeFormatter能够正常工作。
修改后的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,jdk.localedata --win-shortcut --win-menu
请注意,修改后的命令在--add-modules参数中增加了,jdk.localedata。
jdk.localedata模块是Java平台的一部分,它包含了全球范围内的本地化数据。这些数据对于国际化(i18n)应用程序至关重要,它提供了:
通过包含jdk.localedata模块,您的应用程序将能够正确地处理和显示各种本地化信息,而不仅仅是日期格式。
当JavaFX应用程序在使用jpackage打包后出现日期格式化中星期几名称显示为英文的问题时,根本原因在于打包的运行时环境中缺少jdk.localedata模块。通过在jpackage命令的--add-modules参数中显式添加jdk.localedata,可以确保应用程序在独立的运行时环境中也能正确地加载和使用本地化数据,从而实现预期的多语言日期显示效果。虽然这会增加应用程序的包大小,但对于需要全面国际化支持的应用程序而言,这是实现功能完整性的必要步骤。
以上就是解决JavaFX应用jpackage打包后日期语言显示不正确的问题的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号