Code umbauen ?

  • Themenstarter Themenstarter Manuela
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
M

Manuela

Gast
Hallo
ich habe mir diesen Code geschrieben, und Frage mich wie ich diesen Code besser schreiben kann,
denn hier geht es noch mit den Feldern
später wenn ich meine Kunden anlegen will habe ich um die 40 Komponente (JTextField, JComboBox, JCheckBox)
und wenn ich da 40 mal call.set... schreiben muß sieht das ja nicht so gut aus.


Code:
   public void set_liefer_anlegen() { 
        try {
            
            c = Connector.getInstance().getConnection();
            java.lang.String sql = "{  ?  = call  liefer_anlegen (?,?,?,?,?,?,?,?,?,?,?,?,?,?,?,?) }";
            java.sql.CallableStatement call = c.prepareCall(sql);
            
           call.setString(2, this.jTF_fabrikat.getText());
           call.setString(3, this.jCBox_anrede.getSelectedItem().toString());
           call.setString(4, this.jTF_name1.getText());
           call.setString(5, this.jTF_name2.getText());
           call.setString(6, this.jTF_strasse.getText());
           call.setString(7, this.jTF_land.getText());
           call.setInt(8, Integer.parseInt(this.jTF_plz.getText()));               
           call.setString(9, this.jTF_ort.getText());
           call.setString(10, this.jTF_telefon.getText());
           call.setString(11, this.jTF_telefax.getText());
           call.setString(12, this.jTF_email.getText());
           call.setString(13, this.jTF_ansprechpartner.getText());
           call.setString(14, this.jTA_info.getText());
           call.setString(15, this.jTF_rabatt.getText());
           call.setBoolean(16, this.jCkBox_lang.isSelected());
           
                    
          call.executeUpdate();
          call.close();
        }
        catch (SQLException ex) {
            Logger.getLogger("global").log(Level.SEVERE, null, ex);
        }
    }


bin um jeden Tipp dankbar.

Gruß Manuela
 
wenn die GUI-Komponenten alle einzeln aufgeführt sind, dann ist es eben so, mehr als zwei solche Stellen pro 40er-GUI wirst du nicht haben, das ist schon ok

Alternative: dynamische GUIs, Arrays oder Listen von Feldern,
und Indexe/ Keys zur Unterscheidung der einzelnen Felder,

mit int-Konstanten:
public static int INDEX_FABRIKANT = 2;

und dann kann man da viel Code sparen,
z.B.
Code:
for (int i=0; i< MAX_INDEX; i++) {
   setzeFeld(call,i);
}

setzeFeld muss sich den Index anschauen um für ein paar bestimmte Indexe Boolen oder int statt standardmäßig String zu verwenden,

if (index == ...)
oder
if (inBooleanIndexArray(index)
oder ähnliches

statt i von 0 beginnen zu lassen, könntest du die Indexe in einem Index-Array sammeln,

generell sind Enums (Java 1.5) besser als statische Konstanten,
da kann man dann auch zusätzliche Informationen wie der Typ des Feldes speichern
->
if (index.isBooleanField())



hat alles seine Vor- aber auch Nachteile
 
Hallo,

SlaterB
ich kann dir nicht so ganz folgen, oder ich verstehe nicht was du meinst.

ich habe auf einem JPanel meine Textfelder ,Comboboxen und Checkboxen.

könntest du mir anhand meines Codes zeigen wie das mit den enums geht.

Code:
   public enum lieferer {
        fabrikat,anrede,name1,name2,strasse,land,plz,ort,telefon,telefax,email,ansprechpartner,info,rabatt,lang;
    }

????

Gruß Manuela
 
genau, und nun musst du dich entscheiden, ob du die TextFelder in ein Array speichern willst (dann muss das alles recht durchgängig sein),
Code:
int size = lieferer.values().length()
array = new JTextField[size];

oder in eine Map<lieferer,JTextField>

for (lieferer l : lieferer.values()) {
  map.put(l,new JTextField());
}


später dann:

for (int i=0; i< size; i++) { 
   setzeFeld(call,i); // oder setzeFeld(call,array[i]); 
} 

oder

for (lieferer l : lieferer.values()) {
   setzeFeld(call,l); // oder setzeFeld(call,map.get(l)); 
}


für den normal Zugriff z.B.
array[lieferer.anrede].setText(newAnredeString);
bzw.
map.get(lieferer.anrede).setText(newAnredeString);

die Reihenfolge ist natürlich immer zu beachten,
wenn dein SQL zwingend eine andere Reihenfolge als die Enums hat, dann muss man umsortieren

genauso wenn die Textfelder in einer anderen Reihenfolge in die GUI eingefügt werden als in der Enum steht,

da kann man sich dann neue Arrays für neue Reihenfolgen definieren:
lieferer[]anzeige = {leiferer.a, lieferer.c, ..}
oder vielleicht noch andere lustige Sachen machen
 
Oder lege dir für jeden Typen von Daten (z.B. Kunde etc.) eine entsprechende Klasse an und übergebe diese
an die Methoden, die die JDBC-Funktionen ausführen. GUI von Persistenzschicht zu trennen, ist nie verkehrt,
selbst, wenn es auf den ersten Blick nach mehr Arbeit aussieht.
 
hallo SlaterB,

jetzt habe ich aber noch ein problem das ich nicht verstehe,
meine Textfelder haben bestimmte bezeichnungen Beispiel : "jTF_fabrikat" jTF_ ... usw.. ;
muß ich nicht dem enum auf irgendeine Art und weise die noch zuweisen.

????

Gruß Manuela
 
das Ziel ist ja zum einem, dass jTF_fabrikat usw. wegfällt, dass du NUR ein Array oder eine Map mit den JTextField-Objekten hast,

sofern die GUI einigermaßen symmetrisch aufgebaut ist, kannst du dann auch beim Layout den Code drastisch zusammenkürzen (sehr schlecht bei automatischen GUI-Designern),
notfalls wie gesagt jeden individuellen Zugriff auf jTF_fabrikat durch array[lieferer.fabrikat] ersetzen

wenn du bei den einzelnen Variablen bleibst, dann verlierst du einen Teil der Dynamik,
dann musst du in wenigstens einem 40er Block die einzelnen Exemplarvariablen in das Array/ in die Map schreiben,

wäre noch ein Vorteil, falls du viele Codestellen hast, an denen alle 40 TextFelder durchlaufen werden,
wenn es nur 1 bis 2 sind und auch die GUI-Erstellung ein 400 Zeilen langer Code bleibt,
dann lasse es lieber so, wie anfangs gesagt,

bei deinen vielen Nachfragen muss man so oder so sagen,
dass das wahrscheinlich zu schwer für dich ist
 
Ich glaube, dass es nicht "zu schwer für dich" ist, sondern einfach nur "zu schwer". Oder so. Jedenfalls würde mir keine wirklich schöne, elegante Lösung einfallen. Das mit den Arrays wirkt auch irgendwie krampfig. Ehrlich gesagt finde ich die Lösung, die du ursprünglich gepostet hast, noch am einfachsten, übersichtlichsten und leichtesten wartbar. (Sie sollte aber nach Möglichkeit nur EIN mal im Code vorkommen).

Es müssen ja von verschiedenen Components verschiedene Typen geholt werden - ich wüßte nicht, wie man diese "Typ-Mappings" "allgemeingültiger" oder "schöner" lösen könnte, als sie explizit hinzuschreiben (das MUSS ja sowieso irgendwo gemacht werden...)
 
Status
Nicht offen für weitere Antworten.

Zurück
Oben