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

Foi útil?

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

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top