2015-04-13 10 views
5

Czy istnieje sposób zmiany języka tekstów ColorPicker, takich jak "Niestandardowy kolor ...", "Bieżący kolor", "Nowy kolor", "Odcień", "Nasycenie", "Jasność" "," Opacity "," Save "," Use "," Cancel "?Język wybieraka kolorów JavaFX

enter image description here

+0

Do przeliczenia standardowym oknie systemu na inne języki jest kilka informacji tutaj: https://stackoverflow.com/a/45980313/3937190 –

Odpowiedz

4

EDIT: Poniżej odpowiedź jest dla tych, którzy potrzebują trochę więcej egzotyczne język. Jeśli używasz jednego z nich: de, es, fr, it, ja, ko, pt, sv, zh @ sergey-grinev dostarczył wystarczającą odpowiedź.


Wymyśliłem dwa rozwiązania. Obie opierają się na pliku properties. Można tworzyć własne na podstawie przykładów znalezionych w com/sun/javafx/scene/control/skin/resources/ w jxfrt.jar dostarczanych z JRE.

Wszystkie przykłady będą korzystać z polskiego ustawienia narodowego (new Locale("pl", "PL")), które nie jest wbudowane.


Rozwiązanie 1

Tworzenie pliku JAR z następującą strukturę (zmiana odpowiednio przyrostkiem)

com/sun/javafx/scene/control/skin/resources/controls_pl_PL.properties 

i umieścić go w

<path_to_JVM>/lib/ext 

to wszystko.

Nie jestem pewien, co mówi licencja o umieszczaniu niestandardowych plików w pakietach com.sun.*, więc tutaj jest inne rozwiązanie.

Rozwiązanie 2

Tworzenie properties plik jak wyżej, ale można nazwać cokolwiek i umieścić go tam, gdzie chcesz. Powiedzmy, że to będzie

path/to/my/resources/polish.properties 

Utwórz dwie klasy - ResourceBundle.Control i ResourceBundleControlProvider (read more) jak ten.

public class CustomLocaleFxResourceBundleControl extends ResourceBundle.Control { 
    static final String FX_BASE_NAME = "com/sun/javafx/scene/control/skin/resources/controls"; 
    private static final Locale MY_LOCALE = new Locale("pl", "PL"); 

    @Override 
    public String toBundleName(String baseName, Locale locale) { 
     if (FX_BASE_NAME.equals(baseName) && MY_LOCALE.equals(locale)) 
      return "path/to/my/resources/polish"; // without extension 

     return super.toBundleName(baseName, locale); 
    } 
} 
public class CustomLocaleFxResourceBundleControlProvider implements ResourceBundleControlProvider { 
    private static final ResourceBundle.Control MY_RESOURCE_BUNDLE_CONTROL = new CustomLocaleFxResourceBundleControl(); 

    public ResourceBundle.Control getControl(String baseName) { 
     if (CustomLocaleFxResourceBundleControl.FX_BASE_NAME.equals(baseName)) 
      return MY_RESOURCE_BUNDLE_CONTROL; 

     return null; 
    } 
} 

Kompilacja tych klas i umieścić je w pliku JAR wraz z zasobami i META-INF folderu. META-INF folder powinien mieć następującą strukturę

META-INF/services/java.util.spi.ResourceBundleControlProvider 

java.util.spi.ResourceBundleControlProvider to plik tekstowy, który tylko linia jest droga do ResourceBundleControlProvider klasie.W naszym przypadku jest to po prostu

CustomLocaleFxResourceBundleControlProvider 

Kompletna JAR umieścić w

<path_to_JVM>/lib/ext 
+0

Po raz pierwszy wprowadzam takie zmiany i mam pewne problemy.) Używam Eclipse (jdk 1.8.40) i nie mogę znaleźć pliku właściwości, o którym wspomniałeś powyżej. – Alyona

+0

W '/jre/lib/ext' jest plik 'jfxrt.jar', skopiuj go, zmień rozszerzenie na' zip', rozpakuj i zajrzyj do katalogu wymienionego w mojej odpowiedzi – 3ph3r

+0

Dziękuję, pobrałem potrzebny plik właściwości i wprowadziłem w nim zmiany. zarówno CustomLocaleFxResourceBundleControlProvider, jak i CustomLocaleFxResourceBundleControl w bin \ com \ mój folder (gdzie mainApp to), umieść tam również plik controls_pl.properties, ale nie mam pojęcia, jak "skompiluj te klasy i umieść je w pliku JAR razem z folderem zasobów i META-INF. Folder META-INF powinien mieć następującą strukturę. "Po prostu nie mogę zrozumieć, co dokładnie robić. Jestem na poziomie początkującym z Javą i nie mogę jeszcze wszystkiego zrozumieć – Alyona

3

Najprostszym sposobem jest użycie jednego z predefiniowanych ustawień regionalnych, na przykład dodać kolejną linię przed utworzeniem ColorPicker:

Locale.setDefault(Locale.FRENCH); 

Zobaczysz kolejną UI:

french color picker

+2

Działa w języku francuskim. Ale co zrobić, jeśli muszę utworzyć ColorPicker dla innych języków, takich jak rosyjski lub estoński? Próbowałem użyć 'Locale dLocale = new Locale (" ru "); Locale.setDefault (dLocale); ', ale to nie działa. – Alyona

+0

@ user3629015 lol, rosyjski i estoński to dwa języki, którymi posługuję się oprócz angielskiego :) Spójrz na odpowiedź 3ph3r w tym przypadku. –

+0

почему все всегда забывают про русских? ( – sinedsem