Arquitectura de Java – Pregunta sobre las convenciones de ActionListener

Estoy haciendo una interfaz de usuario que muestra gráficos y manipula gráficos. La clase extiende JFrame implementa ActionListener. El ActionListener luego llama a diferentes clases para manipular gráficos dependiendo de la acción. Esto funcionó mientras que la clase tenía pocos ActionListeners; Sin embargo, ahora la clase se está volviendo inmanejable.

Sé que en aras de la encapsulación, sería mejor tener el ActionListener dentro de la clase de interfaz de usuario porque necesita acceder a componentes no estáticos de la interfaz. Sin embargo, parece que hay un conflicto entre la encapsulación y la legibilidad.

Lo que propongo es dividir la clase en una clase para la interfaz y una segunda para el ActionListener y acceder a los componentes de la interfaz de forma estática. Lo que quiero saber es si esto sigue las convenciones de diseño básicas. Y, si este es un enfoque aceptable, ¿ubicaría la clase principal en la clase de interfaz de usuario o la clase ActionListener?

No es una pregunta duplicada … pero mi respuesta debería ayudar con tu pregunta .

En pocas palabras, mi preferencia sería que la clase JFrame no implemente ActionListener y luego tenga un número de clases internas nombradas dentro del JFrame que sí implementan ActionListener.

Yo pondría el main en una clase en sí mismo … y lo llamaría Main.

Aquí hay un código de ejemplo de la forma en que me gusta hacerlo:

import javax.swing.JFrame; import javax.swing.SwingUtilities; public class Main { private Main() { } public static void main(String[] args) { SwingUtilities.invokeLater(new Runnable() { public void run() { createAndShowGUI(); } }); } private static void createAndShowGUI() { final FooFrame frame; frame = new FooFrame(); frame.setupGUI(); frame.pack(); frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); frame.setVisible(true); } } 

y luego la interfaz gráfica de usuario:

 import java.awt.FlowLayout; import java.awt.LayoutManager; import java.awt.event.ActionEvent; import java.awt.event.ActionListener; import javax.swing.JButton; import javax.swing.JFrame; public class FooFrame extends JFrame { private final JButton incrementBtn; private final JButton decrementBtn; private int value; { incrementBtn = new JButton("++"); decrementBtn = new JButton("--"); } private class IncrementListener implements ActionListener { public void actionPerformed(final ActionEvent evt) { increment(); } } private class DecrementListener implements ActionListener { public void actionPerformed(final ActionEvent evt) { decrement(); } } public void setupGUI() { final LayoutManager layout; layout = new FlowLayout(); setLayout(layout); setupListeners(); addComponents(); } private void setupListeners() { incrementBtn.addActionListener(new IncrementListener()); decrementBtn.addActionListener(new DecrementListener()); } private void addComponents() { add(incrementBtn); add(decrementBtn); } private void increment() { value++; System.out.println("value = " + value); } private void decrement() { value--; System.out.println("value = " + value); } }