Как сохранить значения, связанные с юзабилити (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;
   }
}
Другие вопросы по тегам