3

I am currently writing a game, and have come to the point where I need the user to be able to save preferences for things such as the JFrame size, key bindings etc. The users will be running the game through a jar downloaded from my website.

I've decided to go with the Preferences API under "java.util.prefs.Preferences". I am still quite new when it comes to reading things like documentation, and would like someone to help explain a bit to me.

So far, I have something like this:

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

Now then, how do I actually get to saving the preference file on the users computer? Right now, if I run the program again and try just:

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

It just returns null which is the default value if there is nothing saved. I know I am missing the vital part of actually saving the file, and then opening it the correct way, but haven't gotten much out of googling it.

Thanks so much in advance!

Edit: FYI, for reading images, I am using something like this:

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

I would like to be able to do something similar with preferences.

Edit: name and value are both String variables declared beforehand.

4

2 に答える 2

2

nameその変数が同じ値を持っていると確信していますか? 格納された正しい値を返す必要があるため、値が null である可能性がありますか?

保管&入手の直前に印刷してみてください。

保存後に設定をフラッシュすることもできます。

prefs.flush();

Windows を使用している場合は、設定が次の場所に保存されているかどうかを確認できますregedit

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

Linux ではよくわかりませんが、ホーム ディレクトリに隠しフォルダがあるはずです。何かのようなもの

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

レジストリ編集の設定

フレームの最後の位置とサイズを保存するための設定を使用して 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);
            }
    }

編集

ある種の設定保存システムを作成したい場合は、 in RememberableFrame- use 接頭辞と同じ規則を使用できます。

RememberableFrameが使用する:

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

whereidは、開発者が提供するカスタム文字列または空の文字列です。ただし、設定するプロパティのキーには長さ制限があることに注意してください。

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やさまざまなパッケージでも。

于 2013-05-18T19:04:16.513 に答える