繁体   English   中英

如何使用不同的语言制作 JFileChooser?

[英]How to make a JFileChooser with a different language?

我想知道如何用瑞典语制作 JFileChooser。 不幸的是,事实证明,如果我可以使用 JDK 版本 10 或更早版本,我实际上可以通过创建 Locale object 并将其设为默认值来实现。 但是我们不鼓励将这个旧版本用于任何新程序。 但是从 JDK 版本 11 开始,选择瑞典语言环境不再有效。

所以我看到人们已经能够像这个例子中那样更改 FileChooser 的各个字符串: https://coderanch.com/t/475470/java/customizing-JFIleChooser但这让我感到不满意。 至少在我不知道如何了解如何找到这些字符串以及它们位于何处的情况下。 也许我会在使用其他一些 GUI 组件时再次遇到同样的问题,然后我仍然不知道该怎么办。

这适用于 JDK v. 10 或更早版本:


//This is in my Main:

        Locale sverje = new Locale("sv", "SE"); //Creates a instance of Locale for Swedish, Sweden.
        Locale.setDefault(sverje); //Sets this to default.

//Then I call a class that opens a Frame and handles the FileChooser.

这是修改单个字符串的示例:

UIManager.put("FileChooser.cancelButtonText", "Cancelar"); //Changing cancel button text to Portugese

如果我需要使用此方法,那么最好知道如何像我之前所说的那样查找字符串。

当您像示例中那样“放入”新的 String 值时,最好知道发生了什么。

我相信 JFileChooser 以某种方式在几个步骤中继承了字符串,这就是允许我们编写“FileChooser.cancelButtonText”的原因,即使 FileChooser class 中实际上没有“cancelButtonText”,而是(我猜)它继承了它从所谓的 ResourceBundle,然后从那里到 Localeclass,再从那里到其他一些 class 或 FileChooser 使用它之前的类。

那么这是一个正确的假设吗?您如何从 FileChooser class 追踪这些字符串的键/名称/位置到实际位置?

是 ResourceBundle 或 FileChooser 还是自版本 11 停止工作后更改的其他部分? 我可以/应该尝试更改 ResourceBundle 以最专业的方式解决这个问题吗?

如果我错了,请纠正我。 但我认为答案是这样的:如果您想使用 Swing 组件支持的一种语言,只需设置正确的区域设置即可。

如果不是,似乎使用 UIManager.put 是达到 go 的最佳方式。

我希望找到一个包含所有文本字符串的资源包,但现在我不再认为存在这样的东西。

所以我目前的理解是这样的:

诸如 FileChooser 之类的 JComponents 是通用组件,旨在在许多不同的平台和操作系统上工作。

他们使用称为“外观和感觉”的类来根据预期的平台获得最终形式。

这就是 UIManager 发挥作用的地方。

它允许您决定要使用的“外观和感觉”。

所以在我的例子中,它将使用一个名为:“com.sun.java.swing.plaf.windows.WindowsLookAndFeel”的外观。

您可以使用以下方式获取此信息:

System.out.println(UIManager.getSystemLookAndFeelClassName()); 

而且我相信 UIManager 将使用某种算法创建名为 UIDefaults 的类。

UIDefaults 将包含为 JComponents 提供“外观和感觉”的值,即它们的外观和行为。

但是 UIDefaults 类并不是预先存在的。 它们是根据设置创建的。

但是我相信他们会从资源文件中获取一些数据,该资源文件不是真正的 ResourceBundle,但至少扩展了 ResourceBundle class。但这仍然不包含完全自定义 FileChooser 所需的所有字符串。 此链接显示了这些资源文件的示例,这些文件特定于 FileChooser 的 Windows 版本 (L&F): https://code.yawk.at/java/6/com/sun/java/swing/plaf/windows/resources /

所以数据显然是分开的,它不是来自单一来源。 它是从不同来源收集的,并放入 UIDefaults class 中,它的工作方式类似于值的数据库。

总结一下。 go 的最佳方法可能是创建一个 class,它具有使用 UIManager 将所有字符串值放入 UIDefaults 的方法。 我想您可以通过让此方法从您自己创建的资源包中获取字符串来为国际化做准备。

最好的键列表似乎是这个: https://thebadprogrammer.com/swing-uimanager-keys/

但不幸的是,虽然看起来很累,但仍然缺少信息。

要完全自定义 FileChooser 中的所有字符串以及您将在此列表中找到的键,您还需要更改此键的值:

“保存在标签文本中”。

所以这些是我更改的所有字符串,我相信他们将为 Windows 版本的 FileChooser 自定义大部分字符串:

        //Strings for Open file-dialogue:   ***************************************************************************
    
    //The numbers in the comments refers to the order of appearance of the Stirng values in the Frame
    
    UIManager.put("FileChooser.openDialogTitleText","Open");                //1.        
    UIManager.put("FileChooser.lookInLabelText","Look in:");                //2.
    UIManager.put("FileChooser.fileNameLabelText","File name:");                //3.
    UIManager.put("FileChooser.filesOfTypeLabelText","Files of type:");     //4.     
    UIManager.put("FileChooser.openButtonText","Open");                 //5.            
    UIManager.put("FileChooser.cancelButtonText", "Cancel");                //6.        
    UIManager.put("FileChooser.acceptAllFileFilterText","All Files");       //7.
    
    //End of Open file-dialogue ***************************************************************************
    
    //Strings for Save file-dialogue    ***************************************************************************
    
    UIManager.put("FileChooser.saveDialogTitleText","Save as");     //1.        
    UIManager.put("FileChooser.saveInLabelText","Save in:");        //2.  This was not in the list but works!
    // The strings with number 3 & 4 are the same as the ones for the Open file-dialogue so you do not need to set them here.
    UIManager.put("FileChooser.saveButtonText","Save");     //5.      

您可以在这篇文章的第一个答案中找到完整列表(包括 FileChooser 键): List of Java Swing UI properties?

我认为仅设置以“文本”结尾的属性就足够了。

AFAIK UIManager.put 只是更新UIDefaults (包含所有默认名称的 map)所以,只要应用程序中只有一种语言可用,就不需要使用 ResourceBundle。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM