Java actionListener para um sem nome JButton?
-
08-07-2019 - |
Pergunta
Eu queria saber se existe uma maneira de implementar um ouvinte de ação para um JButton sem um nome. Por exemplo, eu tenho a seguinte para loop que cria um botão para cada letra do alfabeto.
for (int i = 65; i < 91; i++){
alphabetPanel.add(new JButton("<html><center>" + (char)i));
}
Existe uma maneira que eu posso adicionar um ouvinte de ação para cada um desses botões sem se livrar do meu loop e difícil de codificação cada JButton e, em seguida, criar um ouvinte de ação para cada um?
Agradecemos antecipadamente,
Tomek
Solução
A sua pergunta é um pouco vaga. seria trivial para modificar o loop para adicionar um ouvinte dentro do 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 você não pode modificar o loop você pode iterar sobre todos os filhos do painel, e adicionar ouvintes a qualquer dos filhos que são JButtons.
também por isso que você está usando html para centralizar o texto? Não é que um exagero? não texto JButton já centro?
você poderia usar setHorizontalAlignement (SwingConstants.CENTER) para fazê-lo também.
Outras dicas
O que é o problema de fazer isso?
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:
}
}
Além disso, se o texto do botão não identifica o botão que poderia definir o nome do botão com a letra do alfabeto.
button.setName((char)i)); // or button.setName(i);
Por nomeada, você parece significar armazenar a ocorrência de botão em uma variável local do seu método de imediato. Tentando evitar que é susceptível de tornar o código mais difícil de ler. Mas, para responder à sua pergunta:
A maneira mais óbvia é usar o velho, mas recentemente popular linguagem de dupla cinta.
alphabetPanel.add(new JButton("<html><center>" + (char)i) {{
addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
});
}});
Note, neste caso, como eu não é definitiva não será utilizável da classe interna anônima. De qualquer associá-la a uma outra variável (final) ou reformular o circuito.
Outro caminho seria ir através de uma ação. (Normalmente eu sugiro evitando ações como eles são jsut Hashtable de um homem pobre. ButtonModel é "bom", embora.)
alphabetPanel.add(new JButton(new AbstractAction("<html><center>" + (char)i) {
public void actionPerformed(ActionEvent event) {
...
}
}));
Então, claro, há o caminho biblioteca específica do aplicativo:
Form alphabetForm = new Form(alphabetPanel);
for (char c='A'; c <= 'Z'; ++c) {
alphabetForm.button("<html><center>" + c, new ActionListener() {
public void actionPerformed(ActionEvent event) {
...
}
});
}
É possível adicionar ActionListener para componentes anônimos como abaixo:
new JButton().addActionListener(new ActionListener(){
@Override
public void actionPerformed(ActionEvent arg0) {
// TODO your action
}
});
No entanto, no seu caso, onde você tenta adicionar o anônimo JButton ao seu painel, esta abordagem não vai funcionar, porque o tipo de retorno do método addActionListener (que é void) serão tomadas em vez de construtor de JButton como mostrado abaixo:
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
}
}));
}
O código acima reclama argumento inválido para o método panel.add ().
Assim, no seu caso, você terá que criar uma instância nomeada do JButton.
Espero que isso esclarece.
Atenciosamente, Suresh