ArraList Objekt mit JButton anzeigen lassen

Javaman91

Bekanntes Mitglied
Hallo,

beim letzten Mal habt ihr mir super weitergeholfen, nochmals danke dafür!

Jetzt benötige ich wieder eure hilfe.

Folgendes, ich habe zwei Array listen.

Java:
ArrayList<JButton> buttons…..

ArrayList<TestKlasse> objectList….

Im nachfolgenden Code erzeuge ich die Button’s die ich auf einem JLabel platziere und weiters eine objectList mit den Objekten der von mir erstellen TestKlasse.
Dabei wird mit jedem neuen Button auch ein neues Objekt meiner TestKlasse erstellt. Die TestKlasse ist einfach nur eine Klasse mit einem JLabel, wo man was machen kann.

Code:
if(event.getSource() == create){ // Mit dem button "create" erzeuge ist die button's für die ArrayList buttons.

buttons.add(new JButton(name.getText())); // Button mit Namen der Array-Liste hinzufügen.
objectList.add(new TestKlasse()); // Hier füge ich der objectList ein Objekt einer TestKlasse hinzu.

    for(int i=0; i<buttons.size(); i++){

        buttons.get(i).addActionListener(this); // ActionListener den Button's hinzufügen.
        label.add(buttons.get(i)); // Dem JLabel die Button's hinzufügen.
    }
this.validate(); // Jframe aktualisieren.
}

Folgendes möchte ich nun machen. Wenn ich z.B. Button1 anklicke, dann soll er mir das erste Objekt aus der objectList anzeigen.
Bei Button2 dann das nächste Objekt der objectList usw.

Hier habe ich meine Abfrage, ob ein Button der buttons Liste geklickt wurde:

Code:
for(int i=0; i<buttons.size(); i++) {

    if(event.getSource() == buttons.get(i)){

        this.validate();
    }
}

Meine Frage ist nun, wie kann ich bei einem Button klick ein Objekt der objectList anzeigen lassen?

SG
 
Also das erste, das mir auffällt: Ist der erste Codeblock wirklich so ein Codeblock oder ist das zusammengesetzt und eigentlich zwei Blöcke?

Hintergrund ist, dass Du erst einen neuen Button hinzufügst aber dann später allen Buttons ActionListener gibst und so...
Wenn Du das für mehrere Buttons machst, dann gehst Du immer alle Buttons durch für ActionListener und um die hinzu zu fügen obwohl es doch nur für den neuesten notwendig ist. Das sollte man also in so fern anpassen, dass dann auch nur der neue Button den ActionListener bekommt und auch nur dieser hinzugefügt wird (der Rest ist ja schon hinzugefügt worden)

Bezüglich des eigentlichen Problems:
Ich habe verstanden, dass Du diverse Controls hast, die irgendwas von TestKlasse anzeigen sollen. Also kannst Du da dann DInge zuweisen. Das wäre also eine Methode wie:

Java:
void showTestKlasse(TestKlasse current) {
    // Angenommen du hast:
    // - ein nameControl, das eine setText Methode hat
    // - TestKlasse hat ein Feld name mit einem Getter getName()
    nameControl.setText(current.getName());
    
    // So weist Du dann alles zu, was Du zuweisen willst...
}

Un das betreffende Element zu bekommen, kann Du natürlich jetzt her gehen und erst die Liste der Buttons durchgehen, wie Du es skizziert hast. Wenn die Buttons aber einen festen Namen haben, dann kannst Du die TestKlasse statt in einer ArrayList in einer HashMap sichern:
Java:
// Erzeugung der HashMap
HashMap<String, TestKlasse> testKlassen = new HashMap<>();


// Einfügen eines Buttons ...
testKlassen.put(button.getText(), new TestKlasse());


// Suchen der TestKlasse und Anzeige
TestKlasse current = testKlassen.get(event.getSource().getText());
if (current != null) showTestKlasse(current);

Bei einer Map hast Du halt key -> Value Paare und Du kannst über den Key zugreifen. Der Key darf sich dann natürlich nicht ändern.
Statt dem Namen kann man auch schauen, was der HashCode von Button ist. Vermutlich wird JButton in der ganzen Ableitungshierarchie das nicht überschrieben haben, so dass auch einfach eine HashMap<JButton, TestKlasse> denkbar wäre. Dann hat man keine Probleme, wenn sich hier der Name etwas ändert ... Und wenn man den Button über einen Text identifizieren möchte: ggf. name setzen und nutzen statt text. (Aber wenn der Text konstant ist, dann ist das auch egal).

Das wären so ein paar einfache Hinweise, die Dir evtl. weiter helfen, Ich würde das vermutlich noch deutlich anders machen, aber das würde vermutlich zu weit gehen. Daher hoffe ich, dass ich Dir hier paar hilfreiche Hinweise geben konnte.
 
Hallo,

jetzt habe ich nochmals eine Frage.
Das mit der HashMap funktioniert soweit einwandfrei!

Ich schreibe die "true" oder "false" values mehrere JRadioButton's in eine map mit:

Java:
map.put(getButtonName, new Boolean[] {button[0].isSelected(), button[1].isSelected()});

"getButtonName" ist der jeweilige button, zu dem das JRadioButton Muster gespeichert werden soll.

So funktioniert es einwandfrei!

Jetzt habe ich aber ein Problem, mit dem oben stehenden Code bin ich auf zwei JRadioButton's beschränkt.
Ich möchte aber die Anzahl der RadioButtons variieren können, z.B. zwei, vier..... JRadioButtons.

Nun habe ich folgendes mit einer for Schleife versucht:

Code:
map.put(getButtonName, new Boolean[] {button[j].isSelected()});

Das funktioniert leider nicht, ich bekomme einen "Index out of bounds" Fehler.

Wie kann ich das machen?

SG
 
Die Beschreibung sagt jetzt nicht wirklich viel aus fürchte ich.

Das funktioniert leider nicht, ich bekomme einen "Index out of bounds" Fehler.
Das besagt lediglich, dass Du auf ein Array Element zugreifst, dass es nicht gibt. Wenn Du ein Array button hast, dann darf das Array nur von 0 bis button.length - 1 gehen.

Mit mehreren put Aufrufen erstellst Du aber kein grösseres Array oder so sondern mit jedem 1 Elementigen Array überschreibst Du das bisher in der HashMap gespeicherte. Wenn Du ein Array von JButtons hast und du ein Array von booleans haben willst, dann wäre es etwas wie:

Java:
boolean[] getSelectedPattern(JButton[] buttons) {
    boolean[] pattern = new boolean[buttons.length];
    for (int i=0; i<buttons.length; i++) {
        pattern[i] = buttons[i].isSelected();
    }
    return pattern;
}

Generell kann man sich aber auch überlegen, ob man sowas als Array implementieren möchte oder ob es nicht Sinn machen würde, hier dynamische Typen wie ArrayList statt dessen zu verwenden. Bei einer Map<String, List<Boolean>> kann man dann an vorhandene Liste etwas anhängen ...
Und dann kommt man auch direkt in den Bereich, dass man zu Daten weiteren Code hat -> Das kann man dann Objektorientiert aufbauen, so dass man Code, der zusammen gehört, an einer Stelle hat und so Konstruktionen wie Map<String, List<...>> kann man dann auch kapseln, was zukünftige Anpassungen erleichtern könnte ...
 

Zurück
Oben