Domanda

Mi chiedevo se esiste un modo per implementare un listener di azioni per un Jbutton senza un nome. Ad esempio, ho il seguente ciclo per creare un pulsante per ogni lettera dell'alfabeto.

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

C'è un modo in cui posso aggiungere un listener di azioni per ciascuno di quei pulsanti senza sbarazzarmi del mio ciclo for e codificare a fondo ogni JButton e quindi creare un listener di azioni per ciascuno?

Grazie in anticipo,

Tomek

È stato utile?

Soluzione

La tua domanda è un po 'vaga. sarebbe banale modificare il loop per aggiungere un ascoltatore all'interno del loop:

ActionListener listener = something;

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

se non riesci a modificare il ciclo, puoi scorrere su tutti i figli del pannello e aggiungere ascoltatori a tutti i bambini che sono jbutton.

anche perché stai usando HTML per centrare il testo? non è eccessivo? jbutton non centra già il testo?
puoi usare anche setHorizontalAlignement (SwingConstants.CENTER) per farlo.

Altri suggerimenti

Qual è il problema di farlo?

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:
     }
}

Inoltre, se il testo del pulsante non identifica il pulsante, è possibile impostare il nome del pulsante con la lettera dell'alfabeto.

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

Per nome, sembra che intendi memorizzare l'istanza del pulsante in una variabile locale del tuo metodo immediato. Tentare di evitarlo potrebbe rendere più difficile la lettura del codice. Ma per rispondere alla tua domanda:

Il modo più ovvio è quello di usare il vecchio ma popolare linguaggio a doppia parentesi.

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

Nota, in questo caso poiché non sono definitivo, non sarà utilizzabile dalla classe interna anonima. Assegnalo a un'altra (finale) variabile o riformula il ciclo.

Un altro percorso sarebbe quello di passare attraverso un'azione. (Di solito suggerirei di evitare le azioni in quanto sono Hashtable di un povero. ButtonModel è "buono" però.)

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

Quindi ovviamente c'è il modo libreria specifico dell'applicazione:

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

È possibile aggiungere ActionListener a componenti anonimi come di seguito:

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

Tuttavia, nel caso in cui si tenti di aggiungere il JButton anonimo al proprio pannello, questo approccio non funzionerà perché verrà preso il tipo di ritorno del metodo addActionListener (che è nullo) invece del costruttore di JButton come mostrato di seguito:

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             
                    }           
                }));
        }

Il codice precedente si lamenta di argomenti non validi per il metodo panel.add ().

Quindi, nel tuo caso, dovrai creare un'istanza denominata di JButton.

Spero che questo chiarisca.

I migliori saluti, Suresh

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top