# ID für GUI Elemente generieren



## Lina (4. Nov 2011)

Hallo zusammen, 

hoffe ihr könnt mir helfen: In einer GUI soll aufgezeichnet werden, welche Elemente und in welcher Reihenfolge der Anwender nutzt. 
Derzeit nutze ich Swing. Für Buttons beispielsweise habe ich JButton abgeleitet und die Konstruktor überlagert. Die Abgeleitete Klasse besitzt eine Variable ID. 
Jeder Konstruktor ruft 2 Methoden auf - setzen der ID und hinzufügen eines ActionListeners. 
Als nächstes Baue ich ein kleines Fenster welches ein paar der "neuen" Buttons beinhaltet. Klickt man auf die Buttons, werden die IDs ausgegeben. 

So, jetzt die Frage: Wie bekomme ich es hin, dass ich eindeutige IDs erhalte? Zuletzt habe ich es mit HashCode versucht. Das Problem: Wenn ich das Programm schliesse und wieder neu aufrufe erhalte ich wieder neue IDs - diese sollen aber statisch sein und sich je Button nicht verändern. 
Was ich vermeiden will ist, dass man bei Verwendung der Buttons sich selbst IDs einfallen lassen muss (die dann unter umständen mehrfach vorkommen). Wie kann ich in diesem Fall eindeutige IDs erzeugen/erhalten? 
Bin für jeden Tipp Dankbar.


----------



## Marco13 (4. Nov 2011)

Im einfachsten fall sowas wie

```
class IDGenerator
{
    private int current = 0;
    public static synchronized String getNext()
    {
        String result = String.valueOf(current);
        current++;
        return result;
    }
}
```
Aber natürlich würden sich da die IDs ändern, wenn man z.B. neue Buttons hinzufügt oder entfernt...


----------



## nillehammer (4. Nov 2011)

Fehlt in Zeile 3 nicht ein static in der Deklaration von current? Marco, korrigiers schnell, bevor der Ändern-Button verschwindet!


----------



## Lina (4. Nov 2011)

Schon mal danke für die Antwort.. 
Die Lösung ist mir auch schon eingefallen, nur wie du schon sagtest - die IDs ändern sich, wenn ein Button hinzugefügt wird.. 

Weiß sonst noch jemand eine Lösung?


----------



## HoaX (4. Nov 2011)

Ich würde es so machen:
Explizit JComponent#setName verwenden um jedem Objekt beim Erstellen einen eindeutigen Namen, oder werden die Elemente dynamisch erzeugt?
Glasspane verwenden um die Klicks/Eingaben abzufangen, dann schauen welches Element da liegt und Namen aufzeichnen, dann die Eingabe an das Fenster weitergeben, dass keiner was von der Glasspane merkt.

Wegen Glasspane schau dir das hier an: How to Use Root Panes (The Java™ Tutorials > Creating a GUI With JFC/Swing > Using Swing Components)


----------



## Lina (4. Nov 2011)

@HoaX: Das mit dem setName und getName habe ich zuerst auch versucht - allerdings wird das später sehr unübersichtlich, da alle Interaktionselemente (Buttons, Textfelder, TextAreas etc.) im gesamte Programm einen eindeutigen Namen erhalten müssen. Daher wollte ich anstelle der Name IDs verwenden und diese dann auch generieren.. 

Weiß sonst noch jemand eine Lösung?


----------



## HoaX (4. Nov 2011)

Du kannst du ja auch immer den Parent holen und dessen Namen vorne dran hängen, so dass du quasi einen Pfad hast, z.B. MainWindow/NewUserBtn oder NewUserWindow/InfoPanel/PictureBtn.
Dann können die Elemente auch unterschiedliche Namen haben wenn sie nicht im selben Container liegen.


----------



## Lina (4. Nov 2011)

Hoax, das ist ein super Tipp! Da ich um die "händische Vergabe" von IDs wohl nicht rum komme, ist das die beste Lösung. Danke! 
Jetzt stellt sich bei mir nur noch eine Frage: Es gibt keine hasParent  Methode.. Wie sollte ich das am besten lösen, etwa so? 
[JAVA=42]
String s = "";
while(element.getParent()!=null){
   s+=element.getParent().getID(); 
}
[/code]


----------



## XHelp (4. Nov 2011)

Dadurch generierst du entweder eine leere ID, oder gerätst in eine Endlosschleife.
Könnte sowas wie:

```
StringBuilder id = new StringBuilder();
id.append(element.getName());
Component parent = element.getParent();
while (parent!=null) {
	id..append("/").append(parent.getName());
	parent = parent.getParent();
}
```
sein. Beachte aber, dass
a) die Reihenfolge verkehrt ist: nicht Grandparent/Parent/Element, sondern Element/Parent/Grandparent
b) das ganze erst funktioniert, wenn alles endgültig hinzugefügt ist, vorher ist ja parent 
	
	
	
	





```
null
```


----------



## Marco13 (5. Nov 2011)

XHelp hat gesagt.:


> a) die Reihenfolge verkehrt ist: nicht Grandparent/Parent/Element, sondern Element/Parent/Grandparent


Das wäre ja mit 
id.insert(0, parent.getName()+"/");;
leicht zu beheben.


----------



## XHelp (5. Nov 2011)

Sicher. Wollte nur darauf hinweisen, dass es nicht 1zu1 die Idee von HoaX ist. Für die ID ist die Reihenfolge eh Jacke wie Hose


----------



## Lina (5. Nov 2011)

Super, ich danke euch!


----------

