# GUI  Formulare



## Gast (2. Dez 2007)

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:


```
public Form(String type){
			
this.type = type;
```


2.) Eine Arraylist mit Components 

Im Konstruktor dann:


```
//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.


```
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


----------



## Wildcard (2. Dez 2007)

Gast hat gesagt.:
			
		

> Vererbung benutze ich hierfür nicht...


Weil...?


----------



## Gast (2. Dez 2007)

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 (2. Dez 2007)

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


----------



## Gast (2. Dez 2007)

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 (2. Dez 2007)

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.


----------



## Gast (2. Dez 2007)

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


----------



## Gast (2. Dez 2007)

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 (2. Dez 2007)

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


----------



## Guest (2. Dez 2007)

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 ?


----------



## Wildcard (2. Dez 2007)

Anonymous hat gesagt.:
			
		

> Wir haben doch Advent . Einer Zeit der Freude under Nächstenliebe. ?


So funktioniert das nicht, ich bin Agnostiker  :bae:


----------



## Gast (2. Dez 2007)

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 (2. Dez 2007)

Hier eine Möglichkeit:
Das was du jetzt im Konstruktor hast

```
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.


----------



## Gast (2. Dez 2007)

Was müßte dann meine abstakte Superklasse enthalten :


```
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...


----------



## Wildcard (2. Dez 2007)

Gast hat gesagt.:
			
		

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


ja


----------



## Guest (3. Dez 2007)

Hallo ,

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



```
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
 

}
```
 


```
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 ?


----------

