Pergunta

Comecei a aprender a usar os ouvintes de ação. Para minha compreensão, funciona da seguinte maneira:

  1. Existem algumas classes que contêm o método "AddactionListener" por padrão (por exemplo, classes para botões).

  2. Usando esse método, adicionamos um ouvinte de ação a um objeto. Por exemplo: listenedObject.addActionListener(listeningObject).

  3. Quando uma ação com o "ouviceBject" é executada, o método "ActionPerformed" do "auditório de objeto" será chamado. Então, isso significa que, quando programamos uma classe para o auditório, precisamos colocar o método "ActionPormed".

O que não está claro para mim, devemos criar uma nova classe para todos os objetos que queremos ouvir. Não me parece uma solução elegante. Por outro Saiba que como as ações executadas pelo ActionPormed diferem dependendo de quem é chamado para esse método).

Na minha opinião, para todos os objetos escutados que precisamos criar são o ouvinte de ação "pessoal" e podemos fazê -lo definindo um valor específico para o campo correspondente do ouvinte de ação. Mas não tenho certeza se é um caminho padrão a percorrer? Como geralmente as pessoas fazem isso?

Foi útil?

Solução

A maneira mais comum de lidar com isso - a julgar pela minha própria experiência pessoal - é simplesmente criar uma classe embutida anônima. Assim:

listenedObject.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        // Your action handling code in here
    }
});

E muitas vezes eu vi pessoas deram uma chamada para um método do objeto que contém o ouviceBject. Por exemplo, em uma caixa de diálogo que possui um botão:

myOkayButton.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        okayButtonPressed();
    }
});

Depois mais tarde na classe de diálogo:

private void okayButtonPressed() {
    // Do what we need to do
}

Outras dicas

Pessoalmente, quando possível, prefiro usar um Ação classe (como exemplo, uma subclasse de AbstractAction) em vez de simplesmente confiar em um ouvinte de ação. Dessa forma, posso fornecer o widget de origem um nome, um ícone, uma dica de ferramenta e assim por diante ...

A maneira como sempre achei útil (para navegação propósitos) é criar uma classe interna anônima que delega para a classe externa:

listenedObject.addActionListener(new ActionListener() {
    @Override
    public void actionPerformed(ActionEvent evt) {
        listenedObject_actionPerformed(evt);
    }
});


private void listenedObject_actionPerformed(ActionEvent evt) {
    //Your handling goes here
}

É muito mais fácil chegar ao seu código de manuseio em um IDE usando uma pesquisa estrutural (Ctrl+F12 na Idea, Ctrl+O no Eclipse).

O problema de usar uma única classe (como uma GUI MyCoolPanel) como o ouvinte comum de um monte de seus componentes (botões etc.) é que o actionPerformed Método então tem muito feio if-else comparações para descobrir Qual botão realmente foi pressionado - nem muito OO!

Você certamente não deve ficar muito preocupado com o atuação Aspectos desse tipo de coisa - é provável que sejam insignificantes ao extremo! A otimização prematura é famosa uma coisa ruim

A maneira como sempre achei útil é criar uma classe separada que implementa a interface ActionListener e todos os outros métodos necessários para transmitir a ação. Dessa forma, uma ação não está ligada a um objeto específica e pode ser acionada de um botão, um menu, etc. um pouco como o Padrão de comando Eu acho. Ele mantém o código simples.

Aulas anônimas não são reutilizáveis.

A redirecionamento para o objeto que contém o ouviceBject leva a classes gigantescas que são difíceis de manter.

Cuidado com os métodos que remove o Listener de remoção por um motivo. Você pode pular os ouvintes se os objetos que você ouvir morrerem com objeto que lida com eventos. Mas se o seu componente esclarecer o modelo fornecido da fonte externa, você deverá adicionar seus ouvintes para adicionar e removê -los nos métodos RemovenoTify. Caso contrário, você pode ter um vazamento de memore.

Talvez não seja realmente no momento, mas acredito que no futuro mais próximo (após o lançamento do Java 7), algo assim seria a maneira comum:

listenedObject.addActionListener ( #{doSmth();} );
Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top