Was würden Profis an meiner Klasse verbessern?

BigMemo007

Aktives Mitglied
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:

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 :p. Egal. Gibt mir alle Verbesserungsvorschläge auch die JavaFX. Ich will alles aufsaugen :):):p:p:):)
 
Zuletzt bearbeitet:

mihe7

Top Contributor
habe eine Modelling-Klasse - ich für meinen bescheidenen Teil bilde mir das zumindes ein, es wäre eine
Was ist eine Modelling-Klasse? In meinen Augen ist das eine UI-Klasse.
Verbesserungsvorschläge bitte weniger auf JavaFx (mit Property-Bindings) usw abziehlen wenn das geht, sondern grundsätlich auf Java gute Code-Patterns
Das ist relativ einfach: erstell das Programm erst für die Konsole mit dem Ziel, das UI später wechseln zu können. Sprich: trenne Logik/Daten vom UI.
 

Ähnliche Java Themen

Neue Themen


Oben