Vantagens para classes aninhadas para ouvintes em GUIs

Para projetos de tamanho decente, fui informado de que, quando você tem aulas estendendo o JPanels, a melhor prática é usar classes aninhadas para implementar os ouvintes. Por exemplo, eu poderia ter uma classe FactoryScreen que estende o JPanel e uma classe aninhada FactoryScreenBrain que implementa todos os ouvintes necessários.

Eu nunca fui capaz de obter uma boa explicação para benefícios ou desvantagens específicos de encapsular minhas aulas dessa maneira e até agora sempre tive apenas aulas que estendem o JPanel e implementam ouvintes. Alguém pode me fornecer alguma orientação sobre isso?

Resposta 1

Ter aulas internas para seus ouvintes torna muito claro o objetivo de todos. Às vezes, também pode evitar muitas verificações se às custas de um pouco mais de codificação.

Se você tem um painel

public class MyPanel extends JPanel implements ActionListener
...
    button1.addActionListener(this);
    button2.addActionListener(this);
    checkbox1.addActionListener(this);
    timer3.addActionListener(this);

    public void actionPerformed(ActionEvent e)
    {
        if(e.getSource() == button1)
        else...
        ... //potentially many elses
    }

é muito difícil ver exatamente o que está acontecendo no seu actionPerformed porque ele lida com tantos eventos diferentes ao mesmo tempo. Tendo um painel:

public class MyPanel extends JPanel
...
    button1.addActionListener(new ButtonListener());
    button2.addActionListener(new ButtonListener());
    checkbox1.addActionListener(new CheckBoxListener());
    timer3.addActionListener(new TimerListener());

    private class TimerListener implements ActionListener
    {
        public void actionPerformed(ActionEvent e)
        {
            //do stuff related only to timers
        }
    }

Agora, se o seu cronômetro tiver um problema, você poderá identificar facilmente a turma com o problema.

Ainda mais importante, em grande escala, torna seu código mais legível. Se alguém quiser trabalhar nessa classe e precisar corrigir a manipulação de eventos com o cronômetro, não precisará pesquisar seus ifs para encontrar a parte com a lógica do cronômetro.

Resposta: 2

Penso que qualquer coisa é melhor do que uma classe estender um Componente Swing e implementar um ouvinte, pois isso confere à classe responsabilidades muito díspares e define uma para a criação dos temidos ouvintes da central. Eu tento usar ouvintes internos anônimos que chamam métodos de uma classe de controle separada. Dessa forma, divido as responsabilidades e posso testar mais facilmente os comportamentos de cada classe isoladamente.

Boa pergunta, a propósito.

Resposta: 3

De alguma forma, pergunta estúpida, tenho que admitir - espero que não me custe muitos pontos. Para deixar claro: eu também ficaria feliz se você puder me ajudar a encontrar o motivo das falhas. Eu não esperaria um ...

Estou tentando retornar um JSON no meu aplicativo Spring MVC 3, mas está falhando para Joda DateTimeFormatter com.fasterxml.jackson.databind.JsonMappingException: nenhum serializador encontrado para a classe org.joda ....

Eu quero extrair quadros de um vídeo e aplicar alguns filtros, como gabor / hough etc. Qual biblioteca Java seria perfeita para lidar com todos os tipos de codificações de vídeo? Eu estive olhando ...

Basicamente, como faço para gerar isso? Tenho certeza de que esse é um trabalho para o GridBagLayout, mas não consigo entender como dimensionar corretamente o 'Painel de Ação' versus a 'Barra de Menus'. O vermelho & ...