Optionsmenü

Status
Nicht offen für weitere Antworten.

TimberlAndRE

Mitglied
Hallo,

ich möchte ein Optionsmenü erstellen (ähnlich wie bei jedem Windows-Programm: Dateimenu -> Einstellungen).
Dazu habe ich mir folgendes Konzept überlegt:

Ich mache einen JDialog der sich beim Klick auf den Menüeintrag öffnet. Dieser bietet dann TextFields in die die Werte (es geht um Pfade á la c:\temp) eingetragen werden können. Diese werden in einer Datei "config.ini" im Programmpfad gespeichert.
Beim Aufrufen der Dialog-Box wird diese Datei dann ausgelesen und beim Schließen per Klick auf den Button "Speichern" dann weggeschrieben.
Wenn die Einstellungen dann irgendwo benötigt werden, wird die Datei ausgelesen und in Variablen geschrieben.

Nun meine Frage: Ist das sinnvoll? Ich meine, gibt es ein sinnvolleres Konzept als dieses (globale Variablen o.ä.?). Nicht falsch verstehen, ich möchte kein Listing bekommen. Da ich erst seit vier Wochen mit Java arbeite, möchte ich die Umsetzung schon selbst erarbeiten (Lernprozess ;-). Ich möchte lediglich Denkanstöße oder Konzepte erfragen. Vielleicht ist das ja völliger unsinn, was ich mir da überlegt habe. ;-)

Ich bin für alles dankbar...

Viele Grüße
Timber
 
G

Gast2

Gast
Moin,

Du machst eine Singleton-Klasse mit den entsprechenden Gettern und Settern für Deine Optionen ... der Klasse spendierst Du noch eine Load und eine Save-Methode ... die Load-Methode rufst Du nur einmal auf und lädst damit die entsprechenden Werte ... nun kannst Du von überall in Deinem Programm auf die Einstellungen zugreifen ohne das jedesmal IO bemüht werden muss

hand, mogel
 

Ebenius

Top Contributor
Deine Frage lautet: Soll ich die Einstellungen meiner Anwendung in einer Datei speichern?
Das hängt von der Anwendung ab. Für alle normalen Anwendungen sollte die Preferences-API eine geschicktere Wahl sein. Wenn Du Dich trotzdem für Dateien entscheiden solltest: Im Java-Umfeld würde man die Datei eher "config.properties" nennen und mit der Properties-Klasse laden und schreiben.

Ebenius
 

TimberlAndRE

Mitglied
Aha! Ich wusste doch, dass mein Weg nicht der kürzeste und einfachste nach Rom sein kann.

Die Preferences-Api scheint doch genau das zu sein was ich brauche. Das Schreiben in eine Datei war nur meine Idee und keine zwingende Voraussetzung.

Trotzdem aus Interesse eine Frage zur Funktionsweise der Singleton-Klasse so wie oben beschrieben: Wenn ich die Load-Funktion nur einmalig ausführe, bekomme ich die (evtl. während der Laufzeit) aktualisierten Einstellungen doch erst beim nächsten Programmstart,oder? Ich müsste doch sonst die Load-Funktion nach jeder Ausführung der Save-Funktion starten, richtig?

Vielen Dank auf jeden Fall, ich werde mich jetzt mal in die Preferences-Api einlesen... :rtfm:
 
J

JohannisderKaeufer

Gast
Nö,

bei der Singelton Klasse hast du eine Load und eine Save Methode.

Load läuft beim erstellen der Singelton Klasse, lädt die Werte und legt sie in Variablen ab.
z.B.

String a = "A";//Also das was in der Datei steht.
String b = "B";

Während das Programm läuft greifst du auf die Variablen zu.
Wenn du was ändern möchtest änderst du die Variablen, z.B.

String a = "a";

Du greifst allerdings weiterhin auf die Variablen zu.

Wenn du save aufrufst, liest du die Variablen aus und speicherst das ganze in deiner Datei.

Die Variablen bleiben aber weiterhin gesetzt.
 

TimberlAndRE

Mitglied
Ah, danke für die Erklärung.

Ich habe es jetzt mit der Preferences-API gemacht. Das ist ja wirklich ein Klacks. ;-)
Eine Frage ist mir jetzt aber noch gekommen.

Wenn das nachher fertige Programm irgendwo installiert wird auf einem Rechner, wo es vorher noch nie drauf war (oder anders gesagt, dort, wo noch keine Prefs-Einträge in der Windows-Registry existieren), muss man dann in der Installationsroutine diese Registry-Einträge anlegen oder geschieht das automatisch beim ersten Programmstart? Von der Abfolge her habe ich jetzt das initiale Laden der Prefs in den Programmstart gelegt. Das heißt, wenn die Registry-Einträge nicht existieren nimmt er ja die angegebenen Default-Werte. Ist das so i.O.? Oder bricht er dann auf einem "unbefleckten" System mit einem Fehler ab?

Hier der Code:

Java:
[...]
    public Uc4toolboxView(SingleFrameApplication app) {
        super(app);
        initComponents();
        // aktuelle Einstellungen laden und in der GUI setzen
        setPreferences();
        // Beim Beenden Programms alle Änderungen zurückschreiben
        Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() {
          public void run() {
            try {
              storePreferences();
            } catch(BackingStoreException ex) {
              ex.printStackTrace();
            }
          }
        }));
[...]

Java:
    void storePreferences() throws BackingStoreException {
        // Ermitteln des zuständigen Knotens
        Preferences prefs = Preferences.userNodeForPackage(getClass());
        // Speichern der Fenster-Position
        prefs.put("export-path", exportpath);
        prefs.put("utilities-path", utilitiespath);
        prefs.put("util-ini-path", utilinipath);
        // Zur Sicherheit alles zurückschreiben
        prefs.flush();
    }

Java:
    void setPreferences() {
        // Ermitteln des zuständigen Knotens
        Preferences prefs;
        prefs = Preferences.userNodeForPackage(getClass());
        // Setzen der Pfade
        exportpath = prefs.get("export-path", "");
        utilitiespath = prefs.get("utilities-path", "");
        utilinipath = prefs.get("util-ini-path", "");
    }
 
Zuletzt bearbeitet:
Status
Nicht offen für weitere Antworten.

Oben