# String soll als Variablenname dienen



## Garth (16. Jan 2006)

Hallo,

ich habe folgendes Problem:
Das Java-Prog soll eine XML-Datei auslesen. In dieser XML Datei sind Felder deklariert (JTextField, JTextArea, ButtonGroup etc).

Basierend auf den Einträgen in der XML Datei soll also quasi ein Formular erstellt werden.
Bei JTextFields kann ich ja problemlos eine temporäre Variable "temp" erstellen und dieser dann mittels "setName" einen neuen Namen zuweisen, den ich aus der XML-Datei als String erhalte.

Bei einer ButtonGroup kann ich dies leider nicht, da hier "setName" nicht vorhanden ist.

Meine Frage also: Wie kann ich eine ButtonGroup mit dem Namen aus meiner XML-Datei erstellen?
Der Name aus der Datei liegt als String vor.


Danke vielmals, Gruß,

Garth


----------



## sliwalker (16. Jan 2006)

Hi,

das würde ich auch gerne wissen.
Hatte das mal das ich das gebraucht hätte, aber hab damals einen anderen Weg genommen.

greetz
SLi


----------



## Bleiglanz (16. Jan 2006)

was willst du denn mit dem Namen, seh da keine Verwendung dafür?

verwende notfalls eine Map, wenn du die Elemente später wieder ansteuern willst


----------



## Garth (16. Jan 2006)

Je nach Übergabe generiert mir das Programm ein Formular, wenn ich den Variablennamen nicht verändere dann habe ich ja zig Variablen mit dem Namen "temp", und das geht ja mal gar nicht!


----------



## Bleiglanz (16. Jan 2006)

wenn du den Sourcecode generierst, dann nenn doch deine Java-Variable gleich so wie es im XML heisst??

wenn du eine Variable "temp" hast, dann heisst die auch nach

temp.setName("Tump")

immer noch temp??


----------



## Garth (16. Jan 2006)

Wie gesagt, bei Textfeldern geht das natürlich problemlos mit setName, jedoch nicht bei der ButtonGroup!
Das ist ja mein Problem, natürlich möchte ich, dass die ButtonGroup so heisst wie in der XML-Datei, aber wenn ich die Variable doch nicht mit setName umbenennen kann, wie kann ich es dann machen?

Gibt es eine Möglichkeit wie 


```
ButtonGroup {"String aus XML" als Name für Variable} = new ButtonGroup();
```

oder so ähnlich?


----------



## Garth (16. Jan 2006)

Vielleicht ein Beispiel:

Ich habe folgende XML-Datei: 

```
<?xml version="1.0" encoding="UTF-8"?>
<Templates>
	<TemplateElement category="incident" name="test1">
		<fieldElement type="JTextField" breite="100" hoehe="20" xpos="10" ypos="10" tfname="tf_Vorname">Vorname</fieldElement>
		<fieldElement type="JTextField" breite="100" hoehe="20" xpos="10" ypos="30" tfname="tf_Nachname">Nachname</fieldElement>
		<fieldElement type="JTextField" breite="100" hoehe="20" xpos="10" ypos="50" tfname="tf_eMail">eMail</fieldElement>
		<fieldElement type="JTextField" breite="100" hoehe="20" xpos="10" ypos="70" tfname="tf_plz">PLZ</fieldElement>
		<fieldElement type="ButtonGroup">group1</fieldElement>
		<fieldElement type="JRadioButton" breite="200" hoehe="20" xpos="10" ypos="90" tfname="Passwort Change" belongsto="group1">Passwort Change</fieldElement>
		<fieldElement type="JRadioButton" breite="200" hoehe="20" xpos="10" ypos="110" tfname="Name Change" belongsto="group1">Name Change</fieldElement>
		<fieldElement type="JTextArea" breite="300" hoehe="100" xpos="10" ypos="150" tfname="Freitext">Freitext</fieldElement>
	</TemplateElement>
</Templates>
```


Ich lese die XML-Datei Element für Element aus und lasse dann pro Element eine Funktion "generateFields(String ....) aufrufen. Wenn dann ein JTextField kommt passiert dann z.B. das:


```
if(type.equals("JTextField"))
			{
				JLabel temp = new JLabel(name);
				temp.setBounds(xpos, ypos, breite, hoehe);
				temp.setName(name);
				
				JTextField temp1 = new JTextField();
				temp1.setBounds(tfxpos, ypos, breite, hoehe);
				temp1.setName(tfname);
				
				this.panel.add(temp);
				this.panel.add(temp1);
			}
```

In dieser Funktion selbst heisst die Variable natürlich noch temp, ich kann aber dann das JTextField später mit dem Namen "tf_vorname" ansprechen.

Ich hoffe, dass ich mich irgendwie verständlich gemacht habe


----------



## Bleiglanz (16. Jan 2006)

ja, also erzeugst du keinen Quelltext sondern das ganze Dingens dynamisch zur Laufzeit

da ist es Wurscht wie die Variablen heissen

und leider hat eine ButtonGroup keinen so schöne ID wie eine JTextBox mit (setName, getName)

also nochmal mein Tipp von oben: alles was du brauchst in einer Map ablegen

und

sowas wie "dynamische" Variablennamen gibts in Java grundsätzlich nicht, das wär auch ganz sinnlos


----------



## sliwalker (16. Jan 2006)

Bleiglanz hat gesagt.:
			
		

> und
> 
> sowas wie "dynamische" Variablennamen gibts in Java grundsätzlich nicht, das wär auch ganz sinnlos



Aha, gut zu wissen das es das grundsätzlich nicht gibt. Das es nutzlos wäre sei mal dahingestellt. 
Ich hab schon eine Situation erlebt, wo ich es gebraucht hätte. Und das ist, wenn Du Daten eben genau aus einer XML-Datei oder HTML/PHP Seite bekommst. Ein Array gibts in Textform nicht.

Wie dem auch sei...
greetz
SLi


----------



## Bleiglanz (16. Jan 2006)

sliwalker hat gesagt.:
			
		

> Das es nutzlos wäre sei mal dahingestellt.


wie gesagt: nimm eine Map, das ist der logisch richtige Ersatz


```
$varname="Sepp";
$$varname = 13;
// lächerlich, da kann ich ja gleich $Sepp schreiben ...
```
denkst mal drüber nach

Denn in den Skriptsprachen auch nicht anders als mit Map/Hashtables usw. realisiert


```
$varname = getStringFromInternetSource();
$$varname = 13;
...
// und jetzt? man kann sowieso NIE auf diese
// Variable zugreifen, weil man bei Programmieren den
// einfach den Namen gar nicht kennt, also schreibt man immer

$$varname = $$varname+42;

// aber das hätte man mit einer Map genauso auch bekommen
```

in welcher Situation hättest du das denn gebraucht?


----------



## sliwalker (16. Jan 2006)

Hoi,

ich glaub Dir ja, dass man es anders lösen kann.

Ich habe es gebraucht, als ich die Variablen aus einem HTML-Formular verarbeiten wollte. Hab es letztendlich mit PHP lösen müssen, wo ich auch die $$-Geschichten gebraucht hab.

Wenn es Dich wirklich interessiert, wo soetwas in Aktion ist, dann such ich Dir gerne die Codezeilen geneuer raus. 

greetz
SLi


----------



## semi (17. Jan 2006)

Was spricht dagegen die Klassen, die bestimmte Features nicht haben (setName(...) etc.) zu überschreiben?
Bau Dir ein Framework, in dem alle Komponenten "gleiches Verhalten"* haben. Dazu noch Factories, die aus
den Informationen, die in der XML Datei vorhanden sind, das ganze erzeugen.

* mit gleichem Verhalten meine ich gleiche Schnittstelle zum Schreiben, Lesen, Validieren etc.
z.B. setValue(...), getValue(), isValid() etc. unabhängig davon, ob es ein Textfeld, ComboBox
oder was auch immer ist.


----------



## AlArenal (17. Jan 2006)

@semi:

Wenn man Bleiglanz Ansatz folgt, spart man sich das Überschrieben einer großen Anzahl von Komponenten. Das Problem ist hier mangelnde Kenntnis / Praxis in Java und nicht dessen Unzulänglichkeiten.

Ich arbeite beruflich mit beiden Sprachen (allerdings deutlich mehr mit Java) und JA, ich hatte kürzlich einen Fall, in dem ich variable Variablennmane benutzt habe und NEIN, ich habe dieses Feature in Java nie vermisst. Ich wüsste nichtmal wo ich es einsetzen sollte.
Wenn man in Java programmiert, sollte man nicht in PHP denken.

If you're in Rome, do like the Romans do.


----------



## semi (17. Jan 2006)

Ich kenne auch beide Sprachen. Stell Dir vor, Du hast ein Formular, egal ob Java oder PHP und darin sind 
Eingabefehler enthalten. Benennst Du die Felder, dann kannst Du eine Fehlermeldung oder Hinweis für den 
Anwender generieren, in der der Name des Feldes steht und was er falsch eingegeben hat.
Ich habe in Java so ein Framework mal geschrieben. Es gab verschiedene Typen von Feldern für unterschiedliche 
Typen von Eingaben (Datum, Zahlen etc. mit paar Regeln wie Anzahl der Vor-/Nachkommastellen, Pflichtfelder,
Eingabelängebeschränkung etc.). Für den Entwickler war es zunächst mal egal, was und wie die Eingabefelder 
funktionieren. Die ganze Validierung geschieht im Hintergrund und ist über Konfigurationsdateien beschreibbar. 
Anhand der Namen der Felder konnten dann entsprechend Fehlermeldungen oder Eingabehinweise generiert 
werden. Zumindest an Stellen, wo es sich direkt bei der Eingabe nicht verhindern lässt, dass die Eingabe 
unvollständig ist (z.B. unvollständiges Datum: "12.01.") oder fehlt (Pflichtfelder leer) war es eine grosse Hilfe, 
den Fehler beim Namen nennen zu können.


----------



## SlaterB (17. Jan 2006)

wo immer man den Namen der Variable angeben muss,
könnte man genauso gut einen beliebigen Variablennamen nehmen 
und den zugehörigen Namen im Objekt/ in eine Map ablegen, fertig,

wenn man natürlich auf fertige Frameworks zugreift die mit dem Variablennamen arbeiten
siehst schlecht aus, das stimmt,
aber gibt es sowas? selber entwickeln sollte man das wohl nicht 

außerdem funktioniert sowas wohl kaum bei der Übergabe von Objekten an andere Operationen 
(mit festen Namen für lokale Variablen)


----------



## Bleiglanz (17. Jan 2006)

LOL, das ist genau der fall bei dem ich das auch schon gemacht habe

```
für alle ($name,$value) in $_GET
            $$name = $value
....
```
ist eigentlich nur ein Trick, um die alten automatischen Variablen von Formularfeldern wieder zu haben,

Wenn ich mein Argument mal zusammenfassen darf:

$$name = "wert"

ist syntactic sugar, das spart nur Schreibarbeit; in Java ist das aus prinzipiellen Gründen nicht möglich und man nimmt eben eine java.util.Map


----------



## semi (17. Jan 2006)

Der Name ist eine Eigenschaft des Eingabefeldes. Wenn man es ausserhalb definiert,
hat es dann recht wenig mit OOP zu tun. Jede Komponente soll sich gefälligst um den
eigenen Kram kümmern. OK, wir haben vermutlich unterschiedliche Szenarien im Kopf. 
Der Vorteil eines Frameworks ist auch, dass sich jeder Entwickler an gleiche Spielregeln 
hält. Es ist in Swing leider so, dass es zu viele Möglichkeiten gibt, eine und die gleiche
Funktionalität zu implementieren. Folge: Jeder macht was er will und der Code wird zum
Alptraum. Die schnellere und einfachere Lösung ist nicht immer die beste.


----------



## semi (17. Jan 2006)

@Bleiglanz
Es gibt bereits eine Funktion in PHP dafür.

extract($_GET)

Das Ergebnis ist das gleiche. Es importiert die Name-Value-Pairs in die Symboltabelle.

:bae:


----------



## sliwalker (18. Jan 2006)

AlArenal hat gesagt.:
			
		

> Wenn man in Java programmiert, sollte man nicht in PHP denken.



Der Satz ist so wahr, den schreib ich mir auf 
Hast schon recht, man muss anders denken als in PHP. 
Und das ist auch verdammt gut so


----------



## Bleiglanz (18. Jan 2006)

mal anders gesagt

```
$$name = "wert" ; //ist unschön:
                            //was wenn es die Variable $name schon gibt??
                            //wenn in $name ungültige Sonderzeichen sind??
                            //Namensraumverseuchung...

parameterMap.put(name,"wert"); //ist gut
```
und was meinst du mit


> Der Name ist eine Eigenschaft des Eingabefeldes. Wenn man es ausserhalb definiert,
> hat es dann recht wenig mit OOP zu tun.



dynamische Variablennamen haber erst recht überhaupt nix mit OO zu tun


----------

