Wie kann ich das speichern / laden von Werten und Einstellungen in einer Datei / aus Datei in JavaFX?
Wie kann ich Werte speichern (von Textfelder, Texteingabefelder, radiobuttons, etc.) und Einstellungen (position auf der Bühne, Vollbild oder normal-Größe, etc.) in eine Datei und laden Sie von dieser Datei ? Ich habe eine Lösung, aber diese Lösung scheint nicht die beste Lösung zu sein, denn es ist sehr viel "code" (wenn ich viele Komponenten).
Ich hatte einen Blick auf dies:
Lesen Properties Datei in Java
http://www.mkyong.com/java/java-properties-file-examples/
Aber diese Beispiele sind sehr einfach:
prop.setProperty("database", "localhost");
prop.setProperty("dbuser", "mkyong");
prop.setProperty("dbpassword", "password");
System.out.println(prop.getProperty("database"));
System.out.println(prop.getProperty("dbuser"));
System.out.println(prop.getProperty("dbpassword"));
Aber 'System.out.println (prop.getProperty("value"));
' ist nicht wirklich "laden" für mich.
Es wird nicht gezeigt, wie ich es in Komponenten wie textfiels, radiobuttons, Checkboxen und so weiter.
In meinem code-snippet, das ich mit anderen Komponenten (textfield, datepicker, rb, cb usw).
Hier ist mein code-snippet:
Sparen:
public void speichern (ActionEvent event) throws IOException
{
if (filename == null)
speichernUnter (event);
else
{
Properties prop = new Properties ( );
FileOutputStream fos = null;
try
{
prop.setProperty ("Name", textField.getText ( ) ); //Save a textfield
if (radioButton.isSelected ( ) )
prop.setProperty ("RadioButtonState", "yes"); //Save rb state
if (checkBox.isSelected ( ) )
{
prop.setProperty ("CheckBoxState", "yes"); //Save cb state
} else
prop.setProperty ("CheckBoxState", "no"); //or not
prop.setProperty ("Date", datePicker.getValue ( ).toString ( ) ); //Save date
prop.setProperty ("Text", textArea.getText ( ) ); //Save long text
fos = new FileOutputStream (filename);
//Save settings in file
prop.storeToXML (new FileOutputStream (filename), "Values and settings", "UTF-8");
} catch (IOException ex)
{
ex.printStackTrace ( );
} finally
{
if (fos != null)
fos.close ( );
} }
}
public void speichernUnter (ActionEvent event)
{
init ( );
FileChooser fileChooser = new FileChooser ( );
//Set extension filter
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter ("PROPERTIES Dateien (*.properties)", "*.properties");
fileChooser.getExtensionFilters ( ).add (extFilter);
//Show save file dialog
File file = fileChooser.showSaveDialog (stage);
if (file != null)
{
try
{
FileWriter fileWriter = new FileWriter (file);
fileWriter.close ( );
filename = file.toString ( );
speichern (event);
} catch (IOException ex)
{
Logger.getLogger (Kontroller.class.getName ( ) ).log (Level.SEVERE, null, ex);
}
}
}
Laden:
public void laden (ActionEvent event) throws IOException
{
if (filename == null)
ladenVon (event);
else
{
Properties prop = new Properties ( );
FileInputStream fis = null;
try
{
fis = new FileInputStream (filename);
//Load Properties from saved XML file
prop.loadFromXML (fis);
textField.setText (prop.getProperty ("Name") ); //load the text
if (prop.getProperty ("RadioButtonState").equals ("yes") ) //load rb state
{
radioButton.setSelected ( );
}
if (checkBox.isSelected ( ) ) //Load cb state
checkBox.setSelected (false);
checkBox.setSelected (true);
}
datePicker.setValue (LocalDate.parse (prop.getProperty ("Date") ) ); //load date
textArea.setText (prop.getProperty ("Text") ); //Load long text
} catch (IOException ex)
{
ex.printStackTrace ( );
} finally
{
if (fis != null)
fis.close ( );
}
}
}
public void ladenVon (ActionEvent event) throws IOException
{
init ( );
FileChooser fileChooser = new FileChooser ( );
FileChooser.ExtensionFilter extFilter = new FileChooser.ExtensionFilter ("PROPERTIES Dateien (*.properties)", "*.properties");
fileChooser.getExtensionFilters ( ).add (extFilter);
//Show load file dialog
File file = fileChooser.showOpenDialog (stage);
if (file != null)
{
try
{
FileReader fileReader = new FileReader (file);
fileReader.close ( );
filename = file.toString ( );
laden (event);
} catch (IOException ex)
{
Logger.getLogger (Kontroller.class.getName ( ) ).log (Level.SEVERE, null, ex);
}
}
}
Tun, ich habe wirklich zu tun " prop.setProperty ("Name", textField.getText ( ) );
' für speichern und dieses 'textField.setText (prop.getProperty ("Name") ); //load the text
' für das laden für alle Komponenten?
Ist meine Lösung die "richtige"?
Es funktioniert alles wie ich es möchte.
Aber gibt es eine bessere und schnellere Lösung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Kurz über die Eigenschaften und die Bindungen API, deine Lösung scheint korrekt zu sein. Wenn Sie feststellen, selbst benötigen zu Holen, mehrere spezifische Eigenschaften mehrere Male, erwägen, eine statische und öffentlich zugänglich ist Mitglied vertritt die loaded-Eigenschaft Wert, so nennt man den Wert so einfach wie
field.setText(Props.NAME_VALUE)
, als ein Beispiel.Können Sie auch eine Helfer-Klasse, die einen exklusiven Zugriff auf Ihre Eigenschaften file und ist verantwortlich für das laden und speichern. Klassen, die Werte müssen konnte Abfragen eigene helper-Klasse mit dem Schlüssel Namen, und diese auch ermöglicht es Ihnen, mit überladenen Methoden für die primitiven Klassen (int, long, double, boolean, etc), so dass Sie nicht haben, zu wiederholen-code, um den Wert und analysiert werden, und stattdessen könnte
box.setSelected(Props.getBoolean("box_selected"))
, als ein Beispiel.Den Vorteil einer helper-Klasse ist, dass es entfernt redundante boilerplate-code und fangen auch analysieren Ausnahmen und geben Sie einen default-Wert, zum Beispiel, wenn die spezifische Eigenschaft konnte nicht gefunden werden oder Ihr Wert war ungültig, oder werfen Sie die Ausnahmen und die Kraft der Anrufer, Sie zu behandeln.