Frage

Ich habe mich gefragt, ob es einen Weg gibt, eine Aktion Hörer für einen Jdrücken ohne Namen zu implementieren. Zum Beispiel habe ich die folgende for-Schleife, die für jeden Buchstaben des Alphabets eine Schaltfläche erstellt.

for (int i = 65; i < 91; i++){
     alphabetPanel.add(new JButton("<html><center>" + (char)i));
}

Gibt es eine Möglichkeit, dass ich eine Aktion Hörer für jede dieser Schaltflächen hinzufügen kann, ohne Schleife meines loszuwerden und hart jeden JButton Codierung und dann eine Aktion Hörer für jeden zu schaffen?

Vielen Dank im Voraus,

Tomek

War es hilfreich?

Lösung

Ihre Frage ist ein wenig vage. es wäre trivial, die Schleife zu modifizieren, um einen Hörer innerhalb der Schleife hinzuzufügen:

ActionListener listener = something;

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i);
     button.addActionListener( listener );
     alphabetPanel.add(button);
}

Wenn Sie die Schleife nicht ändern können Sie alle des Panels Kinder durchlaufen könnte, und fügen Sie die Zuhörer zu einem der Kinder, die JButtons sind.

auch, warum verwenden Sie html den Text zu zentrieren? ist das nicht übertrieben? nicht bereits Mitte Text JButton?
Sie könnten setHorizontalAlignement (SwingConstants.CENTER) verwenden Sie es auch zu tun.

Andere Tipps

Was ist das Problem, dies zu tun?

for (int i = 65; i < 91; i++){
     JButton button = new JButton("<html><center>" + (char)i));
     button.addActionListener( new ButtonListener());
     alphabetPanel.add(button);
}

...

class ButtonListener implements ActionListener {
     ButtonListener() {
     }
     public void actionPerformed(ActionEvent e) {
         //TODO:
     }
}

Auch wenn der Text der Schaltfläche nicht den Knopf identifizieren Sie die Schaltfläche Name mit dem Buchstaben des Alphabets gesetzt könnte.

button.setName((char)i)); // or button.setName(i);

Mit dem Namen, scheinen Sie auf die Schaltfläche Beispiel bedeuten, in einer lokalen Variablen Ihrer unmittelbaren Methode zu speichern. Der Versuch, dies zu vermeiden ist wahrscheinlich, dass Ihr Code schwerer lesbar machen. Aber um Ihre Frage zu beantworten:

Der offensichtlichste Weg ist es, das alte, aber neu beliebtes Doppelstrebe Idiom zu verwenden.

alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
    addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}});

Beachten Sie, in diesem Fall, da ich nicht endgültig ist, wird es nicht von der anonymen inneren Klasse verwendbar sein. Entweder weisen sie an einen anderen (final) Variable oder die Schleife neu zu formulieren.

Ein anderer Weg wäre über eine Aktion zu gehen. (In der Regel würde ich vorschlagen, Aktionen zu vermeiden, wie sie eines armen Mannes Hashtable jsut sind. Button ist „gut“, obwohl.)

alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
    public void actionPerformed(ActionEvent event) {
        ...
    }
}));

Dann natürlich gibt es die anwendungsspezifische Bibliothek Art und Weise:

Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
    alphabetForm.button("<html><center>" + c, new ActionListener() {
        public void actionPerformed(ActionEvent event) {
            ...
        }
    });
}

Es ist möglich, Action anonymer Komponenten wie unten hinzuzufügen:

new JButton().addActionListener(new ActionListener(){
            @Override
            public void actionPerformed(ActionEvent arg0) {
                // TODO your action             
            }           
        });

Doch in Ihrem Fall, in dem Sie versuchen, die anonyme JButton zu Ihrem Panel hinzuzufügen, wird dieser Ansatz nicht funktionieren, da der Rückgabetyp addActionListener Methode (die Leere ist) anstelle von JButton Konstruktor genommen werden, wie unten dargestellt:

for (int i = 65; i < 91; i++){
             alphabetPanel.add(new JButton("<html><center>" + (char)i).addActionListener(new ActionListener(){
                    @Override
                    public void actionPerformed(ActionEvent arg0) {
                        // TODO your action             
                    }           
                }));
        }

Der obige Code beschwert sich über ungültiges Argument für panel.add () -Methode.

Also in Ihrem Fall haben Sie eine benannte Instanz von der JButton erstellen müssen.

Hoffe, dass dies verdeutlicht.

Mit freundlichen Grüßen, Suresh

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top