Swing Public Static GUI für CRM / ERP

MichaProgs

Aktives Mitglied
Hallo liebe Community,

ich arbeite an einem Projekt, dass eine Datenbank über Eingabemasken mit Inhalt füllt und auch wieder ausgeben kann. Ich habe schon öfter gelesen man solle "public static" im Code weitestgehend vermeiden, da man hierdurch einfacher über andere Klassen die Werte ändern kann. Die meisten meiner Textfelder und Comboboxen sind allerdings genau so deklariert, da es Schwierigkeiten beim Auslesen der Textfelder in anderen Klassen gab. Meine Frage wäre nun, ob es programmiertechnisch so in Ordnung ist, oder ob es eine sauberere Möglichkeit gibt die Textfelder in anderen Klassen auszulesen.

Freue mich auf konstruktive Antworten.

MfG
TB94
 
Ja public static ist immer eine schlechte Wahl was dieses Problem angeht.
Eine Möglichkeit wäre es die Referenz der Textfelder zu übergeben.

Schau dir mal das ModelViewControl Pattern an.
 
Zuletzt bearbeitet:
Hallo Joose,

danke für deine Antwort. Habe mir zu diesem Thema mal einige Artikel durchgelesen. Im Grunde ist mein Aufbau in dieser Art, außer das die Listener in der GUI-Klasse hinzugefügt werden. Ansonsten ist der Code für die GUI und der für die Engine getrennt. Anfangs hatte ich versucht die Felder als "public" zu deklarieren, und in der entsprechenden Engine-Klasse wieder zu laden. Wollte ich in der Engine den Inhalt des Textfeldes speichern, war der Wert allerdings immer leer. Seit die Felder public static sind, kann ich auch die Werte auslesen. Gibt es hierzu evtl. noch Lösungsvorschläge?

MfG
TB94
 
Anfangs hatte ich versucht die Felder als "public" zu deklarieren, und in der entsprechenden Engine-Klasse wieder zu laden. Wollte ich in der Engine den Inhalt des Textfeldes speichern, war der Wert allerdings immer leer.

Ohne Code kann man sich das nur schwer vorstellen.
Was meinst du mit "in der entsprechenden Engine-Klasse wieder zu laden"? Was ist eine Engine bei dir?

Seit die Felder public static sind, kann ich auch die Werte auslesen. Gibt es hierzu evtl. noch Lösungsvorschläge?

Ja die Felder sollten "private" sein und wenn nur über "getter" erreichbar sein. Ansonsten siehe mein Vorschlag bezüglich MVC.
 
Da sich mein Projekt momentan über ca. 20 Klassen erstreckt, versuche ich den Code eben minimal wiederzugeben. Angenommen ich habe eine Klasse in der meine GUI steht:

Java:
public class GUI{

 private JLabel lblMain;
 public static JTextField tfMain; 
 private JButton btnSelect;

 public GUI{

   lblMain = new JLabel("Kundennumer");
   tfMain = new JTextField();
   this.btnSelect = new JButton("Select");

   //Felder werden hier noch den Panels hinzugefügt etc.

   this.btnSelect.addActionListener(new ActionListener(){
   
    Engine engine = new Engine();
    try{
     engine.selectCustomer
    }catch(Exception ex){
    }
  });
 }
}

Meine Engine-Klasse:

Java:
public class Engine{

 public void selectCustomer(){
  
  //Datenbankverbindung aufbauen etc.
  PreparedStatement ps = con.prepareStatement("SELECT * FROM customer WHERE customerID =  ?");

  String customerID = GUI.tfMain.getText();

  ps.setString(1, customerID);

  ResultSet rs = ps.exequteQuery();

  while(rs.next()){
  //Textfelder mit Inhalt aus DB füllen
  }
 }
}

So sind in der Regel alle meine Klassen aufgebaut. Wie gesagt hatte ich bereits versucht via public die Felder in der Engine-Klasse aufzurufen, nur wurden die Felder ohne Inhalt ausgelesen. Wenn ich die Felder private deklariere, müsste ich für jedes Feld eine eigene getter- und setter-Methode machen. Das wäre bei mehr als 20 Textfelder sicherlich etwas zu Umfangreich.

MfG
TB94
 
Zuletzt bearbeitet:
So sind in der Regel alle meine Klassen aufgebaut.

Das schreit förmlich nach Parametern 🙂

Java:
public class GUI {
    private JLabel lblMain;
    private JTextField tfMain; 
    private JButton btnSelect;

    public GUI {
        lblMain = new JLabel("Kundennumer");
        tfMain = new JTextField();
        this.btnSelect = new JButton("Select");
        this.btnSelect.addActionListener(new ActionListener() {   
            Engine engine = new Engine();
            try {
                Customer c = engine.selectCustomer(tfMain.getText());
                // TODO: richtiges fenster anzeigen lassen
            } catch(Exception ex) {
            }
        });
    }
}

public class Engine {
    public Customer selectCustomer(String id) {
        //Datenbankverbindung aufbauen etc.
        PreparedStatement ps = con.prepareStatement("SELECT * FROM customer WHERE customerID =  ?");
        ps.setString(1, id);
        ResultSet rs = ps.exequteQuery();
        while(rs.next()) {
            Customer c = new Customer();
            // setter aufrufen
           retrun c;
        }
        return null;
    }
}

Hier dein Code etwas angepasst.
Was vor allem ein großer Designfehler ist: Du hast anscheinend keine Klasse um die Daten eines Customer zu kapseln.
Ein weiterer Fehler ist der Zugriff von Engine auf UI, diese beiden Schichten sollten unabhängig voneinander sein. Sprich es sollte auch möglich sein deine Engine ohne UI zu verwenden.

Oben sagtest du das dein Aufbau MVC ähnelt, leider kann ich das nicht erkennen. Es fehlen die Model Klassen und die Controller/Engine hat Zugriff auf die View.
 
Es scheint wohl als müsste ich mich doch nochmal mit den Grundlage von Java beschäftigen. 🙁 Werde also aus meinen GUI-Klassen erstmal die gesamte Logik entfernen, um dann für diese wiederum eigene Klassen zu erstellen. MVC ist aber definitiv die passende Variante für mein Vorhaben.

Vielen Dank für die ersten Lösungsansätze!

MfG
TB94
 

Zurück
Oben