faulheit = actionCommand

Status
Nicht offen für weitere Antworten.

siroFranz

Bekanntes Mitglied
Hallo,

also habe mit ner Schleife mehrere JButton erzeugt und mein Problem ist, da die alle gleich heißen, kann ich die nicht ansprechen.
Suche eine Möglichkeit die einzelnen Buttons ansprechen zu können.
Beim JMenu habe ich das auch so gemacht, aber da wird das e.getActionCommand() mitgeliefert, wie ich das bei den JButtons jetzt mache, habe ich keinen Schimmer :roll: :roll:

Code:
for(int k=0; k<this.buttonBar[0].length && k<this.buttonBar[2].length; k++){
             this.toolBarOne.add(this.button = new JButton(new ImageIcon(this.buttonBar[0][k])));
             this.button.setToolTipText(this.buttonBar[2][k]);
             this.button.addActionListener(this);
         }

und hier das 2D Array vllt brauch das jm. =?

Code:
 String[ ][ ] buttonBar    = {{"img/neuesDokument.jpg", "img/oeffnen.jpg", "img/speichern.jpg", "img/drucken.jpg", "img/kopieren.jpg", "img/einfuegen.jpg", "img/ausschneiden.jpg", "img/hyperlink.jpg", "img/grafik.jpg", "img/tabelle.jpg"},
                                  {"img/bold.jpg", "img/kursiv.jpg", "img/unterstrichen.jpg"},
                                  {"Neu", "Öffnen", "Speichern", "Drucken", "Kopieren", "Einfügen", "Ausschneiden", "Hyperlink", "Grafik", "Tabelle"},
                                  {"Fett", "Kursiv", "Unterstrichen"}};

Gruß
 

Azrahel

Bekanntes Mitglied
Mach aus dem 2D-Array ein 3D-Array und schieb den new Button grad auch noch mit rein, dann haste ne Referenz drauf.
 

Azrahel

Bekanntes Mitglied
Mein Hirnchen brennt auch grad auf Sparflamme, ich meinte damit das du dir sowas bauen sollst:


Code:
         Vector bla = new Vector();
         for(int k=0; k<this.buttonBar[0].length && k<this.buttonBar[2].length; k++){
         Button b =
            Object[] freu = {this.buttonBar[2][k],  new JButton(new ImageIcon(this.buttonBar[0][k]))};
            bla.add(freu);
             this.toolBarOne.add(this.button =b);
             this.button.setToolTipText(this.buttonBar[2][k]);
             this.button.addActionListener(this);
         }

Dann kannste mit
((Object)bla.elementAt(zahl))[0]=was du suchst
((Object)bla.elementAt(zahl))[1]=button dazu
drauf zugreifen.

Gehts eigentlich noch dirtyier als meine Lösung?

Mach dir doch gleich nen dreispaltigen Vector, erste Spalte deine Ebene, zweite Spalte deine Strings, dritte Spalte deine Buttons, dann haste alles beisammen und damit keinen Stress mehr. vorallem kannste dann mit einer einzigen Schleife durchlaufen und auf die zweite spalte den Namen abfragen und wenn der passt aus der dritten Spalte den Button nehmen :wink:
 

Azrahel

Bekanntes Mitglied
Mein Hirnchen brennt auch grad auf Sparflamme, ich meinte damit das du dir sowas bauen sollst:


Code:
         Vector bla = new Vector();
         for(int k=0; k<this.buttonBar[0].length && k<this.buttonBar[2].length; k++){
         Button b =new JButton(new ImageIcon(this.buttonBar[0][k]));
            Object[] freu = {this.buttonBar[2][k],  b};
            bla.add(freu);
             this.toolBarOne.add(this.button =b);
             this.button.setToolTipText(this.buttonBar[2][k]);
             this.button.addActionListener(this);
         }

Dann kannste mit
((Object)bla.elementAt(zahl))[0]=was du suchst
((Object)bla.elementAt(zahl))[1]=button dazu
drauf zugreifen.

Gehts eigentlich noch dirtyier als meine Lösung?

Mach dir doch gleich nen dreispaltigen Vector, erste Spalte deine Ebene, zweite Spalte deine Strings, dritte Spalte deine Buttons, dann haste alles beisammen und damit keinen Stress mehr. vorallem kannste dann mit einer einzigen Schleife durchlaufen und auf die zweite spalte den Namen abfragen und wenn der passt aus der dritten Spalte den Button nehmen :wink:
 

siroFranz

Bekanntes Mitglied
puh das jetzt bisschen viel aufeinmal für mich, versuch das mal zu verstehen und umzusetzen, hab sowas noch nie gemacht :roll: :###

Gruß
 

Leroy42

Top Contributor
Azrahel hat gesagt.:
Mach aus dem 2D-Array ein 3D-Array und schieb den new Button grad auch noch mit rein, dann haste ne Referenz drauf.

Bevor ich mich jetzt in den Thread vertiefe, behaupte ich einfach mal,
daß solche Lösungen geradezu danach schreien, eine eigene Klasse
zu entwerfen, die alle Informationen kapselt.
 
G

Gast

Gast
ich hab sowas ähnliches auch mal gemacht.

die buttons werden ja auch in ner for schleife erzeugt, also hab ich denen mit setname namen gegeben.
in der schlefie hab ich die einfach nur durchnummeriert, also
setname(i) ( to string oder so war noch dabei)

und wenn du dann das actioncommand checken willst läufste alle buttons duch und checkst mit getname welche nummer das is.
 
G

Gast

Gast
Dem erzeugten Button(JButton button = new JButton())

for(int k=0; k<this.buttonBar[0].length && k<this.buttonBar[2].length; k++){
this.button = new JButton(new ImageIcon(this.buttonBar[0][k]));
this.button.setActionCommand("Auf dieses Kommando höre ich"+k+"zur unterscheidung);
this.toolBarOne.add(this.button = new JButton(this.button);
this.button.setToolTipText(this.buttonBar[2][k]);
this.button.addActionListener(this);
}
 

Azrahel

Bekanntes Mitglied
Leroy42 hat gesagt.:
Azrahel hat gesagt.:
Mach aus dem 2D-Array ein 3D-Array und schieb den new Button grad auch noch mit rein, dann haste ne Referenz drauf.

Bevor ich mich jetzt in den Thread vertiefe, behaupte ich einfach mal,
daß solche Lösungen geradezu danach schreien, eine eigene Klasse
zu entwerfen, die alle Informationen kapselt.

Genau :D Und so könnte das aussehen *grinst*



Code:
package javaforum.helper;

import java.util.Vector;

public class VectorMap {
	private Vector<String> vec_name;
	private Vector<Object> vec_obj;
	private int count;
	
    public VectorMap() {
    	clean();
	}
    
    /**
     * Initialisiert eine neue VectorMap
     * oder setzt die bestehende auf 
     * Startzustand
     */
    public void clean() {
    	vec_name=new Vector<String>();
    	vec_obj=new Vector<Object>();
    	count=0;
	}
    
    /**
     * fügt der Map ein neues Object mit 
     * Namen hinzu
     */
    public void add(String name, Object obj){
    		vec_name.add(name);
	    	vec_obj.add(obj);
	    	count++;
	}
    
    /**
     * aktuelle Größe der Map
     */
    public int size(){
    	return count; 
    }
    
    /**
     * Namen in einer bestimmten Zeile 
     * zurückgeben
     */
    public String getName(int row){
    	return vec_name.elementAt(row);
    }
    
    /**
     * Object in einer bestimmten Zeile 
     * zurückgeben
     */
    public Object getObj(int row){
    	return vec_obj.elementAt(row);
    }
    
    /**
     * Object anhand eines Namen 
     * zurückgeben
     */
    public Object getObjByName(String s) {
		int i;
		for(i=0;i<count;i++){
			if(this.getName(i)!=null){
				if(this.getName(i).equals(s)){
					return this.getObj(i);
				}
			}
		}
		return null;
	}
    
    
    
    /**
	 * @return Returns the m.
	 */
	public VectorMap getObjMapByName(String s) {
		int i;
		for(i=0;i<count;i++){
			if(this.getName(i).equals(s)){
				if(this.getObj(i) instanceof VectorMap)
					return (VectorMap)this.getObj(i);
				return new VectorMap();
			}
		}
		return  new VectorMap();
	}
    
    /**
	 * Löschen einer bestimmten Zeile
	 */
	public void remove(int i) {
		vec_name.removeElementAt(i);
		vec_obj.removeElementAt(i);
		count--;
	}
    
    /**
	 * Löschen aller Zeilen anhand Namen
	 */
	public void remove(String s) {
		int i;
		for(i=0;i<count;i++){
			if(vec_name.equals(s)){
				vec_name.removeElementAt(i);
				vec_obj.removeElementAt(i);
				count--;
			}
		}
	}
}

Die ist jetzt zwar nur für 2 Spalten, aber das ist ja erweiterbar, einfach noch nen Vector<String or whatelse> dabei machen und los geht die wilder Fahrt :D
 

Marco13

Top Contributor
Was sollen denn diese albernen Arrays, oder irgendwelche 3dimensionalen Vectors?

Auch ein Button liefert ein ActionCommand. Standardmäßig ist es die Aufschrift, aber man kann es auch setzen, wie man will. Dann stellt sich die Frage garnicht...

Wie wär's also mit einer Methode
Code:
private JButton createButton(String imageName, String toolTipText)
{
    JButton b = new JButton(new ImageIcon(imageName));
    b.setToolTipText(toolTipText);
    b.setActionCommand(toolTipText); //--------- oder ein anderes....
    b.addActionListener(this);
    return b;
}
die man dann einfach aufruft
Code:
toolBar.add(createButton("bla.jpg", "MachWat"));
toolBar.add(createButton("blubb.jpg", "MachWatAnderes"));

Hm. Unabhängig davon: Lass zumindest diese Arrays und Vectors und so weg.... :(
 

Azrahel

Bekanntes Mitglied
@marco kann sein das ich die Fragestellung vielleicht falsch verstanden hab, aber so wie ich es verstanden hab erzeugt er in ner Schleife seine Buttons und will ausserhalb davon drauf zu greifen. Nun erklär mir bitte wie er nach deiner Lösung ausserhalb des Schleifendurchlaufs ne Referenz auf die Buttons bekommen will ohne sich durch seine
Toolbar hangeln zu müssen? Wenn deine Idee gut ist würd ich was lernen :D

Und heeee, mach meine VectorMap nicht so nieder :cry: , ich benutz die schon seit fast 2 Jahren, sogar mit mehr Spalten, und mir geht sie gut ab...
 

Marco13

Top Contributor
Naja...

Suche eine Möglichkeit die einzelnen Buttons ansprechen zu können.
Das klingt nach dem, was du beschrieben hast (und was mit meiner Lösung nicht geht)

Beim JMenu habe ich das auch so gemacht, aber da wird das e.getActionCommand() mitgeliefert, wie ich das bei den JButtons jetzt mache, habe ich keinen Schimmer
Das klingt aber, als bräuchte er nur das ActionCommand... ???:L

Wenn man das noch allgemeiner machen wollte, könnte man die Klasse "Action" verwenden.

Nicht beleidigt sein :D diese map mag vielleicht für manche Sachen ganz praktisch sein, aber zumindest diese Arrays aus der ursprünglichen Variante fand ich häßlich. Wenn man diese Verbindung braucht (wozu auch immer), dann sollte man vielleicht nochmal Leroy42's Vorschlag in Erwägung ziehen.
 

Azrahel

Bekanntes Mitglied
Ne, war auch nicht beleidigt :D Aber ich hatt schon Angst das ich ihn falsch verstanden hätt und ihm Mist gepostet hätt :bahnhof: Ausserdem bin ich immer lernwillig :D
 
Status
Nicht offen für weitere Antworten.

Neue Themen


Oben