Hallo Comunity,
habe eine Modelling-Klasse - ich für meinen bescheidenen Teil bilde mir das zumindes ein, es wäre eine - geschreiben und würde gerne wissen, wie ihr die schreiben würdet.
Hier die Codes:
@dizm hat mir den Rat mit den functional Interfaces gegeben. Ich hätte den btnEdit.setOnAction und btnOk.setOnAction (fett markiert) mit einem Consumer verkürzen können. Ok, werde ich bald nachholen.
Die Klasse die das Speichern übernimmt
Die Klasse mit den statischen Daten
Folgendes zu wissen würde mich auch sehr interessieren. Ich habe zwei ListViews. Die haben ja in sich schon Observable-Lists. Nämlich die Item-Lists. So. Mein Code greift beim Abspeichern auf die HDD genau auf diese Observable-Lists zu. Kann man das so machen, oder würde man diese Lists auf andere übertragen, die sich z.B. in einer neuen Klasse vielleicht mit dem Namen Data oder ähnlichem befinden und von dort aus auf die Festplatte schreiben?
Verbesserungsvorschläge bitte weniger auf JavaFx (mit Property-Bindings) usw abziehlen wenn das geht, sondern grundsätlich auf Java gute Code-Patterns . Ich weiß, dass man mit Propertys sich das Leben sehr vereinfachen kann, aber ich will wegen dem Verständnis so wenig JavaFx wie möglich. Warum habe ich dann JavaFX gewählt? Weil die Nodes schöner aussehen . Egal. Gibt mir alle Verbesserungsvorschläge auch die JavaFX. Ich will alles aufsaugen
habe eine Modelling-Klasse - ich für meinen bescheidenen Teil bilde mir das zumindes ein, es wäre eine - geschreiben und würde gerne wissen, wie ihr die schreiben würdet.
Hier die Codes:
Java:
package model;
import java.util.Optional;
import conVar.CVSubBook;
import enums.EnListView;
import handler.ConBook;
import javafx.geometry.Insets;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.Button;
import javafx.scene.control.ButtonType;
import javafx.scene.control.ListView;
import javafx.scene.control.TextField;
import javafx.scene.input.MouseButton;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import util.BookDelAlert;
import util.BookLVTF;
import util.StorLV;
public class ModBook {
ConBook conBook;
StorLV storLV;
ListView<Object> inLV;
ListView<Object> outLV;
ListView<Object> currLV;
// needed to get name of item
TextField selectedTF;
// needed to easy delete items
HBox selectedHbox;
public ModBook(ConBook conBook) {
this.conBook = conBook;
storLV = new StorLV();
inLV = conBook.getGBook().getInLV();
outLV = conBook.getGBook().getOutLV();
}// constructor
// needed only for adding Items in List
private void selectLV(EnListView lv) {
if (lv == EnListView.inLV) {
currLV = this.inLV;
} else if (lv == EnListView.outLV) {
currLV = this.outLV;
}
}// selectLV
// every column in ListView is created here
private HBox createLine() {
// ****** create and add nessery nodes ******
HBox hbox = new HBox(10);
BookLVTF tf = new BookLVTF();
StackPane stp = new StackPane();
Button btnOk = new Button(CVSubBook.txtBtnOk);
Button btnEdit = new Button(CVSubBook.txtBtnEdit);
stp.getChildren().addAll(btnEdit, btnOk);
hbox.getChildren().addAll(tf, stp);
// ****** settings nodes ******
btnOk.setPadding(new Insets(4));
btnEdit.setPadding(new Insets(4));
btnEdit.setVisible(false);
// ****** sets Listener ******
// changes from edit-mode to showing-mode
[B]btnOk.setOnAction[/B](event -> {
// if typed any content
if (tf.getText().length() > 0) {
tf.setEditable(false);
btnOk.setVisible(false);
btnEdit.setVisible(true);
}
//if ok is clicked, added items will be stored at hdd
sendToSave();
});
// changes form show-mode to edit-mode
[B] btnEdit.setOnAction[/B](event -> {
tf.setEditable(true);
btnEdit.setVisible(false);
btnOk.setVisible(true);
tf.requestFocus();
});
// if enter is clicked will do same as btnOk
tf.setOnAction(event -> {
// if typed any content
if (tf.getText().length() > 0) {
tf.setEditable(false);
btnOk.setVisible(false);
btnEdit.setVisible(true);
//if Enter is clicked, added items will be stored at hdd
sendToSave();
}
});
// gives the focus on listView-column if TextField is focused by user
tf.setOnMouseClicked((MouseEvent event) -> {
if (event.getButton() == MouseButton.PRIMARY) {
// gives a ListView (->HBox ->ListViewSkin ->Group ->VirtualFlow1 ->VirtaulFlow2 ->ListView)
Object tmp = tf.getParent().getParent().getParent().getParent().getParent().getParent();
// after user focus a TextField in Column will selected right ListView
if (tmp == inLV) {
currLV = inLV;
outLV.getSelectionModel().clearSelection();
} else if (tmp == outLV) {
currLV = outLV;
inLV.getSelectionModel().clearSelection();
}
int index = currLV.getItems().indexOf(hbox);
currLV.getSelectionModel().select(index);
// needed as global if want delete items
selectedHbox = hbox;
// neded global to set as booking
selectedTF = (TextField) hbox.getChildren().get(0);
}
});
return hbox;
}// createLine
// ***** if btnOk (in HBox in LV-Column) is clicked will process ******
private void sendToSave() {
HBox hbox = null;
TextField tf = null;
String content = "";
for (int i = 0; i < currLV.getItems().size(); i++) {
hbox = (HBox) currLV.getItems().get(i);
tf = (TextField) hbox.getChildren().get(0);
content = content + tf.getText().trim() + System.lineSeparator();
}
if (currLV == inLV) {
storLV.save(content, EnListView.inLV);
} else if (currLV == outLV) {
storLV.save(content, EnListView.outLV);
}
}//sendToSave
public void addItemToLV(EnListView lv) {
selectLV(lv);
currLV.getItems().add(createLine());
}// addItem()
// here is no argument EnListView lv needed, because only added item can be
// delted
public void remItemFromLV() {
BookDelAlert alert = new BookDelAlert(AlertType.CONFIRMATION, selectedTF.getText());
Optional<ButtonType> result = alert.showAndWait();
if (result.get() == ButtonType.OK) {
currLV.getItems().remove(selectedHbox);
//if ok button for deleting is clicked, updated list will stored att hdd
sendToSave();
}
}// remItem
public void displayItem() {
if (selectedTF != null) {
if (selectedTF.getText().length() != 0) {
System.out.println(selectedTF.getText());
} else {
System.err.println("Inhalt vom ausgewähltem Konto ist leer");
}
} else {
System.err.println("Keine Auswahl getroffen");
}
}// dsiplayItem
}// class
@dizm hat mir den Rat mit den functional Interfaces gegeben. Ich hätte den btnEdit.setOnAction und btnOk.setOnAction (fett markiert) mit einem Consumer verkürzen können. Ok, werde ich bald nachholen.
Die Klasse die das Speichern übernimmt
Java:
package util;
import java.io.BufferedWriter;
import java.io.File;
import java.io.FileWriter;
import java.io.IOException;
import conVar.CVMain;
import enums.EnListView;
/*
* Storing and Loading incomeLV und outgoingLV from class GBook
*/
public class StorLV {
//directory
private static File dir;
public StorLV() {
// create directory if not exists
dir = new File(CVMain.dirName);
if (!dir.exists()) {
dir.mkdirs();
} else {
//System.out.println(dir.toString() + " existiert bereits!");
}
}// constructor
public void save(String content, EnListView enumLV) {
String fileName = "";
if (enumLV == EnListView.inLV) {
fileName = CVMain.fileInName;
} else if (enumLV == EnListView.outLV) {
fileName = CVMain.fileOutName;
}
try {
BufferedWriter bw = new BufferedWriter(new FileWriter(CVMain.dirName+fileName));
bw.write(content);
bw.flush();
bw.close();
} catch (IOException e) {
e.printStackTrace();
}
}// save
}//class
Die Klasse mit den statischen Daten
Java:
package conVar;
public class CVMain {
public static final String appName = "NoGoinDebt";
public static double lyotSizeX = 800;
public static double lyotSizeY = 600;
//****** Storing and Loading ******
private static final String userHome = System.getProperty("user.home");
private static final String furtherDirs = "\\Documents\\";
public static final String dirName = userHome + furtherDirs + appName;
public static String fileInName = "\\LVincome.txt";
public static String fileOutName = "\\LVoutgoing.txt";
}//class
Folgendes zu wissen würde mich auch sehr interessieren. Ich habe zwei ListViews. Die haben ja in sich schon Observable-Lists. Nämlich die Item-Lists. So. Mein Code greift beim Abspeichern auf die HDD genau auf diese Observable-Lists zu. Kann man das so machen, oder würde man diese Lists auf andere übertragen, die sich z.B. in einer neuen Klasse vielleicht mit dem Namen Data oder ähnlichem befinden und von dort aus auf die Festplatte schreiben?
Verbesserungsvorschläge bitte weniger auf JavaFx (mit Property-Bindings) usw abziehlen wenn das geht, sondern grundsätlich auf Java gute Code-Patterns . Ich weiß, dass man mit Propertys sich das Leben sehr vereinfachen kann, aber ich will wegen dem Verständnis so wenig JavaFx wie möglich. Warum habe ich dann JavaFX gewählt? Weil die Nodes schöner aussehen . Egal. Gibt mir alle Verbesserungsvorschläge auch die JavaFX. Ich will alles aufsaugen
Zuletzt bearbeitet: