gpt4 book ai didi

java - 从 JAR 中保存首选项

转载 作者:塔克拉玛干 更新时间:2023-11-02 08:52:22 25 4
gpt4 key购买 nike

我目前正在编写游戏,已经到了需要用户能够保存 JFrame 大小、键绑定(bind)等首选项的地步。用户将通过下载的 jar 运行游戏从我的网站。

我决定使用“java.util.prefs.Preferences”下的 Preferences API。对于阅读文档之类的东西,我还是很陌生,希望有人能帮我解释一下。

到目前为止,我有这样的东西:

Preferences prefs = Preferences.userNodeForPackage(com.custardgames.horde2d.Game.class);
prefs.put(name, value);

那么,我该如何真正将首选项文件保存到用户计算机上呢?现在,如果我再次运行该程序并尝试:

Preferences prefs = Preferences.userNodeForPackage(com.custardgames.horde2d.Game.class);
System.out.println(prefs.get(name, null));

如果没有保存任何内容,它只返回 null,这是默认值。我知道我错过了实际保存文件的重要部分,然后以正确的方式打开它,但谷歌搜索并没有得到太多。

提前致谢!

编辑:仅供引用,为了阅读图像,我使用的是这样的东西:

BufferedImage currentImage=ImageIO.read(this.getClass().getClassLoader().getResource("res/images/image.jpg"));

我希望能够对偏好进行类似的操作。

编辑:namevalue 都是预先声明的字符串变量。

最佳答案

您确定 name 变量具有相同的值吗?因为它应该返回正确的存储值 - 也许值是 null?

尝试在存储和获取之前将它们打印出来。

您还可以尝试在存储后刷新首选项:

prefs.flush();

如果您使用的是 Windows,您可以检查首选项是否存储在 regedit

\HKEY_CURRENT_USER\Software\JavaSoft\Prefs\<your package path>

在 Linux 中我不确定,但你的主目录中应该有一个隐藏文件夹。有点像

~/.java/.prefs/<package path>

Regedit preferences

我开发了一个 JFrame,它使用首选项来存储框架的最后位置和大小。您可以在这里查看:

RememberableFrame

图书馆位于: java-utils

您可能感兴趣的代码片段:

    public void saveSize() {
Preferences preferences = Preferences.userNodeForPackage(this.getClass());
preferences.put(getId() + X_KEY, String.valueOf(getLocation().x));
preferences.put(getId() + Y_KEY, String.valueOf(getLocation().y));
preferences.put(getId() + W_KEY, String.valueOf(getSize().width));
preferences.put(getId() + H_KEY, String.valueOf(getSize().height));
preferences.put(getId() + MAX_KEY,
String.valueOf((getExtendedState() & JFrame.MAXIMIZED_BOTH) == JFrame.MAXIMIZED_BOTH));
try {
preferences.flush();
}
catch(BackingStoreException e) {
e.printStackTrace();
}
}

public void setSavedSize() {
Preferences preferences = Preferences.userNodeForPackage(this.getClass());
String xs = preferences.get(getId() + X_KEY, "");
String ys = preferences.get(getId() + Y_KEY, "");
String ws = preferences.get(getId() + W_KEY, "");
String hs = preferences.get(getId() + H_KEY, "");
String max = preferences.get(getId() + MAX_KEY, "");

if(max != null && !max.trim().isEmpty() && Boolean.valueOf(max) == true) {
setDefaultSize();
setExtendedState(JFrame.MAXIMIZED_BOTH);
return;
}

if(xs.length() == 0 || ys.length() == 0 || ws.length() == 0 || hs.length() == 0) {
setDefaultSize();
}
else {
sizeFromPreferences = true;
int x = Integer.parseInt(xs);
int y = Integer.parseInt(ys);
int w = Integer.parseInt(ws);
int h = Integer.parseInt(hs);
setLocation(x, y);
setSize(w, h);
}
}

编辑

如果您想创建某种设置存储系统,您可以使用与 RememberableFrame 相同的约定 - 使用前缀。

RememberableFrame 中,我使用:

    private String getId() {
return this.getClass().getSimpleName() + id;
}

其中 id 是开发者提供的自定义字符串或空字符串。但是请记住,您要设置的属性的键是有长度限制的。

来自 API:

static int  MAX_KEY_LENGTH 
Maximum length of string allowed as a key (80 characters).
static int MAX_NAME_LENGTH
Maximum length of a node name (80 characters).
static int MAX_VALUE_LENGTH
Maximum length of string allowed as a value (8192 characters).

您还可以考虑使用专门用于“存储设置”目的的类。例如 KeyboardSettings 类,甚至在不同的包中。

关于java - 从 JAR 中保存首选项,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16627648/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com