在Java中检索存储的首选项

在Java中检索存储的首选项,java,preferences,Java,Preferences,首选项put和get方法需要并返回字符串值,但我需要处理对象(颜色),即 很明显,最后一行有一个类型不匹配,但我也不能在prefs中存储实际颜色 prefs.put(“savedColour”,Color.RED) 因为您需要将其存储为字符串(或int,但不是color) 有什么解决办法吗?唯一想到的是非常混乱。也许您可以向Color类添加一个构造函数,该构造函数接受一个字符串并构建Color实例 public Color(String nameOfColor) { // do stuff

首选项
put
get
方法需要并返回字符串值,但我需要处理对象(颜色),即

很明显,最后一行有一个类型不匹配,但我也不能在prefs中存储实际颜色

prefs.put(“savedColour”,Color.RED)

因为您需要将其存储为字符串(或int,但不是color)


有什么解决办法吗?唯一想到的是非常混乱。

也许您可以向
Color
类添加一个构造函数,该构造函数接受一个字符串并构建
Color
实例

public Color(String nameOfColor) {
  // do stuff
}
此外,您应该为
Color
类实现
toString()
方法。

如果本质上需要“序列化”对象本身,可能需要使用Preferences API的替代系统,例如,或者可能是将对象“保存”到磁盘的选项

这将比仅仅使用Preferences API更复杂,请注意,如果能够像Tichodroma所描述的那样存储对象信息,我可能会这样做,但是您是否能够获得更大的灵活性,能够将您感兴趣的对象表示为不仅仅是字符串


您甚至可以使用它作为Preferences API的补充,以便只序列化更复杂的对象,并将基本内容保存在Preferences格式中。

将颜色值转换为十六进制值,然后将其存储为字符串。检索时,将十六进制值解码为字符串

public static String getColorString(Color c) {
    int i = c.getRGB() & 0xFFFFFF;
    String s = Integer.toHexString(i).toUpperCase();
    while (s.length() < 6) {
        s = "0" + s;
    }
    return s;
}

public static void putColor(Preferences node, String key, Color c) {
    node.put(key, "0x" + getColorString(c));
}

public static Color getColor(Preferences node, String key, Color default_color) {
    Color result = default_color;
    String value = node.get(key, "unknown");
    if (!value.equals("unknown")) {
        try {
            result = Color.decode(value);
        } catch (Exception e) {
            System.out.println("Couldn't decode color preference for '" + key + "' from '" + value + "'");
        }
    }
    return result;
}
公共静态字符串getColorString(c色){
int i=c.getRGB()&0xFFFFFF;
字符串s=Integer.toHexString(i).toUpperCase();
而(s.长度()<6){
s=“0”+s;
}
返回s;
}
公共静态颜色(首选项节点、字符串键、颜色c){
node.put(键,“0x”+getColorString(c));
}
公共静态颜色getColor(首选项节点、字符串键、颜色默认值\u颜色){
颜色结果=默认颜色;
字符串值=node.get(键,“未知”);
如果(!value.equals(“未知”)){
试一试{
结果=颜色。解码(值);
}捕获(例外e){
System.out.println(“无法从“+”值+”解码“+”键+”的颜色首选项”;
}
}
返回结果;
}

有一种方法可以将对象存储在首选项中,但需要几个步骤。您可以将对象转换为字节数组,在2D字节数组中将其分解为多个部分,然后将字节数组存储到单个节点的插槽中。下面是一个关于如何操作的分步示例:


我将对此进行调查。我认为使用RGB值可能更好,它在toString()方法中给出(Color已经有了这个方法)。但是颜色只是这个应用程序中需要为首选项保存的许多内容之一,我将看看它是否适用于其他所有内容。:-)我刚刚发布了相同的答案,几乎是一样的,但你首先得到了。这里似乎发生了很多事!
public static String getColorString(Color c) {
    int i = c.getRGB() & 0xFFFFFF;
    String s = Integer.toHexString(i).toUpperCase();
    while (s.length() < 6) {
        s = "0" + s;
    }
    return s;
}

public static void putColor(Preferences node, String key, Color c) {
    node.put(key, "0x" + getColorString(c));
}

public static Color getColor(Preferences node, String key, Color default_color) {
    Color result = default_color;
    String value = node.get(key, "unknown");
    if (!value.equals("unknown")) {
        try {
            result = Color.decode(value);
        } catch (Exception e) {
            System.out.println("Couldn't decode color preference for '" + key + "' from '" + value + "'");
        }
    }
    return result;
}