GUI Formulare

Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo,

einen schönen 1. Advent allerseits.

Die Frage vorweg: Ist mein nachstehend erklärtes Vorgehen aus OOP Sicht vertretbar oder muss
ich das Pferd ganz anders aufzäumen ?

Ich habe ein Problem mit dem richtigen Vorgehen zum Erzeugen meiner Formulare. Man muss sich
vorstellen, dass viele Formulare fast identisch sind:


So habe ich eine Klasse "Form" mit der ich alle Formulare erzeuge.

1.) Ein Konstruktor der einen Typ übergeben bekomt:

Code:
public Form(String type){
			
this.type = type;


2.) Eine Arraylist mit Components

Im Konstruktor dann:

Code:
//hier alle identischen Formulare in die ArrayList
components.add(anrede);
components.add(vorname);
components.add(name);
......

//Jetzt die Unterteilung--------

if (type == "xxx" || type == "yyy")
{
 components.add(nummer);
components.add(bla);
components.add(button);

}
else if (type == "sss" || type == "zzz")
{
components.add(nummeranders);
components.add(blub);
components.add(buttonanders);
}


}//Konstruktor


Jetzt habe ich eine Funktion vom Typ JPanel, die alle Komponenten in der ArrayList zuweist.

Code:
else if( comp instanceof JComboBox ) {
					   
if ( type.equals("xxx") || type.equals("yyy"))
((JComboBox) comp).setEditable(false);
 //ComboBox
 buildConstraints(constraints, 1, 5, 1, 1, 20, 20);
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.WEST;
 ((JComboBox) comp).setSelectedIndex(1);
 allgemein.add( comp, constraints);						  					   
}
else if( comp instanceof JTextField ) {
....
}
else if( comp instanceof JTextArea ) {

}

So erzeuge ich die Ansichen der Formulare und die Datenerfassung..

Ist das so OOP mäßig OK. Immerhin kann ich so mit 2, 3 Funktionen viele verschiedene Forms und Ansichten erzeugen.

Vererbung benutze ich hierfür nicht...

Viele Grüße
 
G

Gast

Gast
Hallo Wildcard,

weil ich eine ArrayList benutze und wenn ich neue Komponenten
hinzufügen möchte , brauche ich bloß meine ArrayListe eine
Komponente hinzufügen . Diese wird dann automatisch an der richtigen Stelle im Panel platziert.

Sag mir doch bitte, wie Du das machen würdest oder besser wie Du es machst ?
 

Wildcard

Top Contributor
Deine if's sind einfach nicht nötig wenn die Typen Spezialisierungen einer abstrakten Superklasse sind.
 
G

Gast

Gast
OK, du meinst ich erstelle eine Klasse Person, meine Superklasse.
Von der leite ich meine Klassen Lehrer, Schüler, Pädagoge , Rektor etc. ab.

Dann erzeuge ich die ArrayList in der Superklasse und
in der Klasse lehrer füge ich die sezifischen Daten für den Lehrer
hinzu ?

Gegen die Methode mit der ArrayList un dem Auslesen mit Instanceof spricht doch nichts oder ?

VG
 

Wildcard

Top Contributor
if instanceof ist (wie eigentlich jedes if) immer eine Kapitulation vor 'richtigem' OOP Design.
Perfekter OOP Code muss nicht casten und braucht keine if's, da die Objekte immer wissen was zu tun ist.
Im Einzelfall muss man natürlich abwägen wann ein if/instanceof trotzdem die praktikablere Lösung ist.
 
G

Gast

Gast
nee, hattest du gesagt "abstakte" Superklasse. Da kann ich ja nur
definieren. Vielleicht könntest Du Deine Anmerkung noch etwas verdeutlichen?
 
G

Gast

Gast
Ok. Das mein Code wohl nicht perfekt ist, wußte ich im Vorege auch schon. Dewegen habe ich ja dieses Thread angestoßen.

Gibt es vielleicht ein Beispiel, nach dem ich mich richten kann?
Viellecht eines mit der akstakten Superklasse ?
 

Wildcard

Top Contributor
Abstrakt nur deshalb, weil es keinen Sinn macht eine Instanz von einem generischen Formular zu erzeugen.
 
G

Guest

Gast
Wildcard hat gesagt.:
Abstrakt nur deshalb, weil es keinen Sinn macht eine Instanz von einem generischen Formular zu erzeugen.

Wir haben doch Advent . Einer Zeit der Freude under Nächstenliebe. Kann ich Dich vielleicht zu einem
Stück Beispielcode überreden, der skizziert, wie ich nun am Gescheitesten meine Formulare erstellen kann ?
 
G

Gast

Gast
Das akzeptiere ich, ohne Frage :) Vielleicht bist Du ja Nihilist?

Letzten Endes ist doch die Frage, ob Du ein philantrop bist ?

Welches Antrieb solltest Du sonst haben hier im Forum aktiv zu sein?

Ich benötige nur etwas mehr, als dass, was ich bekommen habe.

Magst Du mir vielleicht noch einmal etwas detaillierter erläutern, welches Vorgehen sinnvoll wäre ?
 

Wildcard

Top Contributor
Hier eine Möglichkeit:
Das was du jetzt im Konstruktor hast
Code:
components.add(anrede);
components.add(vorname);
components.add(name);
......

//Jetzt die Unterteilung--------

if (type == "xxx" || type == "yyy")
{
components.add(nummer);
components.add(bla);
components.add(button);

}
else if (type == "sss" || type == "zzz")
{
components.add(nummeranders);
components.add(blub);
components.add(buttonanders);
}
Kannst du ersetzen durch den Aufruf einer abstrakten Methode initializeComponents die in den konkreten Spezialisierungen passend überschrieben wird.
 
G

Gast

Gast
Was müßte dann meine abstakte Superklasse enthalten :

Code:
public abstact class Form {

public void initializeComponents();

}

Die Superklasse müßte doch schon den Code bereitstellen,
der immer doppelt ist, damit dieser nur einmal geschrieben weren bracht...
 
G

Guest

Gast
Hallo ,

ich habe jetzt noch einmal ein Beispiel. Hattest du das so in etwa gemeint ?


Code:
public abstract class Person extends JPanel{
 
 /**
  *
  * Abstarkte Methode zum Initialisieren der GUI
  */
 abstract public void initialize();
 
 JPanel allgemein;
 GridBagConstraints constraints;
 JLabel vornameLabel;
 JTextField vorname;
 
 
 void buildConstraints(GridBagConstraints gbc, int gx, int gy, int gw, int gh, int wx, int wy)
 {
  gbc.gridx = gx;
  gbc.gridy = gy;
  gbc.gridwidth = gw;
  gbc.gridheight = gh;
  gbc.weightx = wx;
  gbc.weighty = wy; 
 }
 

 public Person(){
  
  allgemein = new JPanel();
    
   //Erstellung des GridBagLayouts
  constraints = new GridBagConstraints();
     GridBagLayout grid = new GridBagLayout();
     allgemein.setLayout(grid);
  
         //vorname label
       buildConstraints(constraints, 0, 6, 1, 1, 20, 20);
       constraints.fill = GridBagConstraints.NONE;
       constraints.anchor = GridBagConstraints.EAST;
       JLabel vornameLabel = new JLabel("  Vorame: ", JLabel.LEFT);
       allgemein.add( vornameLabel, constraints);
      
       //vorname Textfeld
       buildConstraints(constraints, 1, 6, 1, 1, 20, 20);
       constraints.fill = GridBagConstraints.NONE;
       constraints.anchor = GridBagConstraints.WEST;
       vorname = new JTextField(20);
       allgemein.add( vorname, constraints);
      
       
  
 }//Konstruktor
 

}


Code:
public class Schueler extends Person{

JLabel nameLabel;

JTextField name;

public Schueler(){

initialize();

}

@Override

public void initialize() {

//name label

buildConstraints(constraints, 2, 6, 1, 1, 40, 40);
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.EAST;
JLabel nameLabel = new JLabel(" Name: ", JLabel.LEFT);
allgemein.add( nameLabel, constraints);

//name Textfeld

buildConstraints(constraints, 3, 6, 1, 1, 20, 20);
constraints.fill = GridBagConstraints.NONE;
constraints.anchor = GridBagConstraints.WEST;
name = new JTextField(20);
allgemein.add( name, constraints);

}

}

War das so gemeint ?
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben