Tener clases internas para sus oyentes hace que el propósito de todos los oyentes sea muy claro. También a veces puede evitar muchas verificaciones a expensas de un poco más de codificación.
Si usted tiene un panel
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
}
que es muy difícil de ver exactamente lo que está pasando en su actionPerformed porque maneja tantos eventos diferentes a la vez. Que tiene un panel:
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
}
}
Ahora bien, si el temporizador tiene un problema que se puede identificar fácilmente la clase con el problema.
Aún más importante, a gran escala, hace que su código sea más legible. Si alguien más quiere trabajar en esta clase y necesitan arreglar el manejo de eventos con el temporizador, no tienen que buscar en su ifs para encontrar la parte con la lógica del temporizador.
Extender innecesariamente un 'JPanel' (o' JFrame' o 'Thread') no es una buena práctica. Pero entonces, la programación GUI y las buenas prácticas no tienden a cumplir –