Home > Net >  How to make a JFileChooser with a different language?
How to make a JFileChooser with a different language?

Time:02-02

I want to know how I can make a JFileChooser in the Swedish language. Unfortunately it turns out that if I could use a JDK version 10 or earlier i could actually do this by creating a Locale object and make it the default. But we are discouraged to use this old version for any new programs. But from JDK version 11 and forward choosing Swedish Locale no longer works.

So I have seen that people have been able to change individual strings for the FileChooser like in this example: https://coderanch.com/t/475470/java/customizing-JFIleChooser But this feels unsatisfactory to me. At least for as long as I do not know how I can learn about how I can find those Strings and where they are located. Maybe I will run into the same problem again with some other GUI component and then I still don't know what to do.

This works with JDK v. 10 or earlier:


//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.

This is an example of modifying an individual string:

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

If I need to use this method it would be nice to know how to find the strings like I said before.

It would also be nice to know what is going on when you "put" in the new String value like in the example.

I believe that the JFileChooser somehow inherits the Strings in several steps, and that is what allows us to write "FileChooser.cancelButtonText" even if there actually is no "cancelButtonText" in the FileChooser class, rather (I'm guessing!) it inherits it from a so called ResourceBundle and then from there to the Localeclass and from there to some other class or classes before the FileChooser uses it.

So is this a correct assumption and how can you trace the Key / name / location of those strings from the FileChooser class to where the actually are?

Is it the ResourceBundle or the FileChooser or some other part that was changed since it stopped working from version 11? Can / should I try to make changes to the ResourceBundle to fix this in the most professional way?

CodePudding user response:

You can find the full list (including FileChooser keys) in the first answer of this post: List of Java Swing UI properties?

I think it will be enough setting only the properties ending in "Text".

AFAIK UIManager.put is just updating UIDefaults (the map that contains all the default names) so, as long as there is just one language available in the application, there is no need to use a ResourceBundle.

CodePudding user response:

So correct me if I am wrong. But I think the answer is something like this: If you want to use one of the languages that is supported for the Swing Component just set the correct Locale and you are done.

If not it seems like using UIManager.put is the best way to go.

I was hoping to find a resource bundle containing all of the text strings but now I do no longer think that such a thing exists.

So my understanding at the moment is this:

The JComponents such as the FileChooser are generalized Components that are meant to work on many different platforms and operative systems.

And they use classes called "Look & Feel" to get their final form depending on the intended Platform.

This is where the UIManager comes in.

It allows you to decide what "Look & Feel" you want to use.

So in my case it will use a look and feel called: "com.sun.java.swing.plaf.windows.WindowsLookAndFeel".

You can get this information using:

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

And I believe that the UIManager will create classes called UIDefaults using some algorithm.

The UIDefaults will contain the values that gives the JComponents their "Look & Feel" i.e. their appearance & behaviour.

But the UIDefaults classes are not pre-existing. They are created based on setup.

However I believe that they will get some of their data from a resource file that is not truly a ResourceBundle but at least extends the ResourceBundle class. But this still does not contain all the necessary Strings to fully customize the FileChooser. This link shows an example of these resource files that are specific to the Windows version (L&F) of the FileChooser: https://code.yawk.at/java/6/com/sun/java/swing/plaf/windows/resources/

So the data is apparently split up and it does not come from a single source. It is collected from different sources and put into the UIDefaults class that works like a Database for the values.

To sum it all up. The best way to go might be to create a class that has a method to put all the String values into the UIDefaults using the UIManager. And I suppose you could prepare for internationalization by letting this method get it's strings from a resource bundle that you have created yourself.

The best list of Keys seems to be this one: https://thebadprogrammer.com/swing-uimanager-keys/

But unfortunately although seemingly exhausting there is still information missing.

To fully customize all the Strings in the FileChooser in addition to the Keys you will find in this list you will also need to change the value of this Key:

"saveInLabelText".

So these are all the String I changed and I believe they will customize most of the Strings for the Windows version of the 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","Spara som");       //1.        
    UIManager.put("FileChooser.saveInLabelText","Spara i:");        //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","Spara");        //5.      
  • Related