在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;
}