Java-Architektur – Frage zu ActionListener-Konventionen

Ich mache eine Benutzerschnittstelle, die Graphen zeigt und Graphen manipuliert. Die class erweitert JFrame implementiert ActionListener. Der ActionListener ruft dann abhängig von der Aktion verschiedene classn zum Bearbeiten von Diagrammen auf. Dies funktionierte, während die class wenige ActionListeners hatte; Jetzt wird die class jedoch unüberschaubar.

Ich weiß, dass es im Interesse der Kapselung am besten wäre, den ActionListener in der Benutzerschnittstellenklasse zu haben, da er auf nicht statische Komponenten der Schnittstelle zugreifen muss. Es scheint jedoch, als ob es einen Konflikt zwischen Verkapselung und Lesbarkeit gibt.

Was ich vorschlage ist, die class in eine class für die Schnittstelle und eine zweite für den ActionListener zu brechen und statisch auf die Schnittstellenkomponenten zuzugreifen. Was ich wissen möchte, ist das folgt grundlegende DesignKonventionen? Und wenn dies ein akzeptabler Ansatz ist, würden Sie die Hauptklasse in der Benutzerschnittstellenklasse oder der ActionListener-class platzieren?

Keine doppelte Frage … aber meine Antwort sollte bei Ihrer Frage helfen .

Kurz summery, meine Präferenz wäre, dass die JFrame-class nicht ActionListener implementiert und dann eine Anzahl von benannten inneren classn mit dem JFrame hat, die den ActionListener implementieren.

Ich würde das Haupt in eine class stellen … und es Main nennen.

Hier ist ein Beispielcode für die Art, wie ich es machen möchte:

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); } } 

und dann die GUI:

 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); } }