Как сохранить значения, связанные с юзабилити (Font, Dimension, Color,...) в файле свойств, используя ResoucesBundles
Я могу получить строки, используя файл свойств и класс ResourceBundle, используя ResourceBundle.getString()
, И даже может извлекать объекты типа int и float, используя также:
int a = (int) ResourceBundle.getObject("IntKey");
float b = (float) ResourceBundle.getObject("FloatKey");
Но я хочу знать, как получить некоторые сложные объекты, такие как шрифты?
Font font = (Font) ResourceBundle.getObject("FontKey");
Но как сохранить значения Font в файле свойств? Могу ли я сохранить объект как: new Font("Tahoma", Font.PLAIN, 12);
в ключ: значение файла свойств.
Обновление 1:
@doublesharp ваш ответ в порядке. На самом деле я не расширяю класс ResourceBundle для переопределения метода handleGetObjects(). Моя реализация как показано ниже:
public class Usability {
private static final String BUNDLE_NAME = "com.upgrade.utility.resources.Usability";
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
private Usability() {}
public static String get(String key, Object ... args) {
String value = null;
try {
value = RESOURCE_BUNDLE.getString(key);
for (Object var : args) {
if (var != null) {
try {
value = value.replaceFirst("@", var.toString());
} catch (Exception e) {}
}
}
} catch (MissingResourceException e) {
value = '!' + key + '!';
}
return value;
}
public static Font getFont(String key){
Font value = null;
try {
String fontName = (String) RESOURCE_BUNDLE.getString(key+ ".Name");
Integer fontStyle = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Style"));
Integer fontSize = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Size"));
value = new Font(fontName, fontStyle, fontSize);
} catch (MissingResourceException e) {
value = new Font("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
value = new Font("Tahoma", Font.PLAIN, 11);
}
System.out.println("Font"+ value);
return value;
}
}
Как я могу использовать ваш метод в этом случае? Я новичок в JAVA, подскажите, пожалуйста, как изменить мою реализацию, чтобы использовать метод handleGetObjects()?
Обновление 2:
@doublesharp: Из вашего последнего комментария я изменил вот так, но получил исключение Class Cast в 3-й строке класса Usability.
public class Usability {
private static final String BUNDLE_NAME = "com.upgrade.utility.resources.Usability";
public static final MyResourceBundle RESOURCE_BUNDLE = (MyResourceBundle) MyResourceBundle.getBundle(BUNDLE_NAME);
private Usability() {}
public static String get(String key, Object ... args) {
String value = null;
try {
value = RESOURCE_BUNDLE.getString(key);
for (Object var : args) {
if (var != null) {
try {
value = value.replaceFirst("@", var.toString());
} catch (Exception e) {}
}
}
} catch (MissingResourceException e) {
value = '!' + key + '!';
}
return value;
}
}
Мой расширенный класс ResourceBunlde:
import java.awt.Color;
import java.awt.Dimension;
import java.awt.Font;
import java.util.Enumeration;
import java.util.MissingResourceException;
import java.util.ResourceBundle;
public class MyResourceBundle extends ResourceBundle{
@Override
public Object handleGetObject(String key) {
if (key.contains("Font")) {
return getFont(key);
} else if (key.contains("color")){
return getColor(key);
}else if (key.contains("Dimension")){
return getDimension(key);
}
return this.getObject(key);
}
public Font getFont(String key){
Font value = null;
try {
String fontName = (String) this.getString(key+ ".Name");
Integer fontStyle = Integer.parseInt(this.getString(key+ ".Style"));
Integer fontSize = Integer.parseInt(this.getString(key+ ".Size"));
value = new Font(fontName, fontStyle, fontSize);
} catch (MissingResourceException e) {
value = new Font("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
value = new Font("Tahoma", Font.PLAIN, 11);
}
return value;
}
public Color getColor(String key){
Color value = null;
try {
Integer R = Integer.parseInt(this.getString(key+ ".R"));
Integer G = Integer.parseInt(this.getString(key+ ".G"));
Integer B = Integer.parseInt(this.getString(key+ ".B"));
value = new Color(R, G, B);
} catch (MissingResourceException e) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}
return value;
}
public Dimension getDimension(String key){
Dimension value = null;
try {
Integer X = Integer.parseInt(this.getString(key+ ".X"));
Integer Y = Integer.parseInt(this.getString(key+ ".Y"));
value = new Dimension(X, Y);
} catch (MissingResourceException e) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}
return value;
}
@Override
public Enumeration<String> getKeys() {
return null;
}
}
Как разрешить это исключение?
А также есть ли проблема в моем ответе? используя который я просто звонил, как
Usability.getFont("JPanelUpgradeTypeScreen.ElementLabelFont");
Но используя ваш ответ techinque, мне нужно назвать его как (преобразование типа необходимо в вызове):
(Font)Usability.RESOURCE_BUNDLE.handleGetObject("JPanelUpgradeTypeScreen.ElementLabelFont");
5 ответов
В классе я определил следующие функции, которые я вызываю всякий раз, когда мне нужно получить доступ к значению, связанному с юзабилити. Все связанные с юзабилити значения хранятся в общем месте (файл свойств).
private static final String BUNDLE_NAME = "com.testApp.resources.properties.Usability";
private static final ResourceBundle RESOURCE_BUNDLE = ResourceBundle.getBundle(BUNDLE_NAME);
public static Font getFont(String key){
Font value = null;
try {
String fontName = (String) RESOURCE_BUNDLE.getString(key+ ".Name");
Integer fontStyle = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Style"));
Integer fontSize = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Size"));
value = new Font(fontName, fontStyle, fontSize);
} catch (MissingResourceException e) {
value = new Font("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
value = new Font("Tahoma", Font.PLAIN, 11);
}
return value;
}
public static Color getColor(String key){
Color value = null;
try {
Integer R = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".R"));
Integer G = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".G"));
Integer B = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".B"));
value = new Color(R, G, B);
} catch (MissingResourceException e) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}
return value;
}
public static Dimension getDimension(String key){
Dimension value = null;
try {
Integer X = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".X"));
Integer Y = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Y"));
value = new Dimension(X, Y);
} catch (MissingResourceException e) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
// value = new Color("Tahoma", Font.PLAIN, 11);
}
return value;
}
}
В файле свойств, который я поддерживаю для значений, связанных с юзабилити, свойства определяются следующим образом:
#BLACK
ElementLabelFont.Color.R=4
ElementLabelFont.Color.G=4
ElementLabelFont.Color.B=4
#ScreenPanel dimension
ScreenPanel.Dimension.X=632
ScreenPanel.Dimension.Y=625
#Font of jCheckBoxYesAgreement
JPanelPreUpgradeStepsScreen.jCheckBoxYesAgreement.Font.Name=Tahoma
JPanelPreUpgradeStepsScreen.jCheckBoxYesAgreement.Font.Style=0
JPanelPreUpgradeStepsScreen.jCheckBoxYesAgreement.Font.Size=12
Объекты не должны инициализироваться в файле свойств. В файле свойств следует использовать только постоянные значения
Вы можете сериализовать свой пользовательский объект и затем обернуть двоичный код, например, в кодировку base64, которую вы можете записать в свойства в виде строки
Принимая во внимание все ваши ответы и комментарии: это ответ, который удовлетворяет моим требованиям:
public static Font getFont(String key){
Font value = null;
try {
String fontName = (String) RESOURCE_BUNDLE.getString(key+ ".Name");
Integer fontStyle = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Style"));
Integer fontSize = Integer.parseInt(RESOURCE_BUNDLE.getString(key+ ".Size"));
value = new Font(fontName, fontStyle, fontSize);
} catch (MissingResourceException e) {
value = new Font("Tahoma", Font.PLAIN, 11);
}catch (NullPointerException npe) {
value = new Font("Tahoma", Font.PLAIN, 11);
}
return value;
}
внутри файла свойств я сохранил как
#Usability
DialogTextFont.Name=Tahoma
DialogTextFont.Style=0
DialogTextFont.Size=12
Вы должны переопределить handleGetObject()
метод для вашей реализации. Вы не можете сохранить определение объекта в файле свойств, но вы можете сохранить его параметры инициализации в виде ключей и использовать их при возврате вашего объекта. В этом примере вы должны установить свойства для font-family
(Тахома и т. Д.), font-type
(текстовое значение, используемое для сопоставления с Font.BOLD и т. д.), и font-size
, призвание MyResourceBundle.getObject("font")
(класс, который расширяет ResourceBundle
) Назову вашу реализацию handleGetObject()
а затем используйте предыдущие значения для создания вашего объекта:
@Override
public Object handleGetObject(String key) {
if (key.equals("font")) {
String family = this.getString("font-family");
String strType = this.getString("font-type");
int type;
switch (strType){
case "bold": Font.BOLD;
default: type = Font.PLAIN;
}
int size = this.getInt("font-size");
return new Font(family, type, size);
} else {
return null;
}
}