Variablenname dynamisch vergeben

  • Themenstarter Themenstarter Gast
  • Beginndatum Beginndatum
Status
Nicht offen für weitere Antworten.
G

Gast

Gast
Hallo!
Ich habe bei mir in einem Skript folgenden Code. Kann man die Variablenvergebung nicht irgendwie einfacher machen, in einer Schleife oder ähnlichem?
Code:
Button b1 = new Button();
cp.add(b1);
Button b2 = new Button();
cp.add(b2);
Button b3 = new Button();
cp.add(b3);
Button b4 = new Button();
cp.add(b4);
Button b5 = new Button();
cp.add(b5);
...
Button b36 = new Button();
cp.add(b36);
 
for (int i=0; i<36; i++) {
cp.add(new Button());
}

Sinn ist dabei aber fraglich 😉
 
jo, der sinn ist dabei schon fraglich. sinnvoller wäre es dann, wenn du einen ActionListener zusätzlich registrierst und diesen dazu befähigst, zwischen den buttons zu unterscheiden:
Code:
String[] buttonLabels = new String[]{"Knopf1", "Knopf2", "Knopf3"};
for( int i = 0; i < buttonLabels; i++ ){
    JButton button = new JButton(buttonLabels[i]);
    button.addActionListener(this);
    button.setActionCommand("button"+i);
}
...
public void actionPerformed(ActionEvent e){
    if( "button1".equals(e.getActionCommand() ){
        ...
    }
    else if( "button2".equals(e.getActionCommand() ){
        ...
    }
    else if(...){  // usw.
        ...
    }
}

sinnvoll oder nicht ist abhängig von dem was du damit tun willst. ich gebe dir recht, daß es eine fleißarbeit ist, für jeden button eine eigenes objekt zu deklarieren, dieses zu instanziieren, es mit den korrekten werten zu füllen, in ein layout einzubinden und eine entsprechende action zu registrieren, aber das ist in aktuellen programmiersprachen die realität, solange, bis irgenwann mal eine metasprache existiert, die die aufforderung "ich will nen speichern-button haben" korrekt in code umsetzt. selbstverständlich aber kannst du dir viel arbeit ersparen, wenn du für gleiche arbeitsschritte im umgang mit GUI-elementen methoden entwirfst. beispielsweise:
Code:
private JButton createButton(String label, Container parent, int x, int y, String actionCommand){
    JButton button = new JButton(label);
    button.addActionListener(this);
    button.setActionCommand(actionCommand);
    parent.add(label,new GridBagLayout( x, y, 1, 1, 1.0, 1.0, GridBagConstraints.CENTER, 
                     GridBagConstraints.HORIZONTAL, new Insets( 0, 0, 0, 0), 20, 5);    
}

viel glück

wayne
 
SlaterB hat gesagt.:
for (int i=0; i<36; i++) {
cp.add(new Button());
}

Sinn ist dabei aber fraglich 😉

Wenn ich das so machen würde, wie könnte ich dann später z.B. bei dem Button 25 den Hintergrund verändern.
Mit meinem Code könnte ich einfach b25.setIcon(icon) eingeben, aber bei dir würrde das nicht gehen, weil die Buttons keine Namen haben.
 
Code:
Button buttons = new Button[36];

for(int i=0; i < buttons.length; i++)
{
    buttons[i] = new Button();
    //hier eventuell weitere Eigenschaften einstellen (ActionListener, Icon,...)
    cp.add(buttons[i])
}

den 25. button kannst du dann mit buttons[24].setIcon(icon) ändern
 
ja, das mit den Variablennamen hatte ich etwas verschlafen, steht sogar in der Überschrift..

also wenn du 36 einzelne Variablen haben willst, dann musst du sich auch einzeln definieren, da führt kein Weg dran vorbei,

man könnte da noch etwas tricksen mit einem Array nebenbei,
a la

JButton b1, b2, b3, ..;
JButton[] buttons = {b1,b2,b3, ..};
// Schleife über Array zur Erzeugung der Buttons, Einfügung ins cp und anderes allgemeines
+
// Einzelbefehlte wie b25.setIcon(icon)

deutlich schöner ist aber, einfach nur ein Array einzusetzen, siehe Ariol
 
Gast hat gesagt.:
SlaterB hat gesagt.:
for (int i=0; i<36; i++) {
cp.add(new Button());
}

Sinn ist dabei aber fraglich 😉

Wenn ich das so machen würde, wie könnte ich dann später z.B. bei dem Button 25 den Hintergrund verändern.
Mit meinem Code könnte ich einfach b25.setIcon(icon) eingeben, aber bei dir würrde das nicht gehen, weil die Buttons keine Namen haben.
im actionlistener zb (oder in den anderen listener ebenso) bekommst du ueber getSource den Verursacher der Action... also zb den Button. Dann kannst du mit dem machen was du willst - du brauchst also gar nicht irgendwelche namen dafuer
 
Für namenlose Komponenten gibt es immer noch Container#getComponentCount und Component#getComponent(int index)

Viel Spass so zu arbeiten. 😀

bye Saxony
 
Code:
for(int i = 0; i < 42)
{
System.out.println("Button b"+i+" = new Button(); ");
sysout(bla...);
}

ausgeben, kopieren und einfügen.
Aber ob das viel Sinn ergibt außer das du dir die Tipparbeit sparst...
Eher solltest du dein Problem nochmal überdenken und schaun ob du wirklich Buttons benötigst oder ob sowas wie MouseListener ausreicht um dann die Kords abfragst.
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Zurück
Oben