Java体系结构 – 关于ActionListener约定的问题

我正在创建一个用户界面,显示图形和操作图形。 该类扩展JFrame实现了ActionListener。 然后,ActionListener根据操作调用不同的类来操作图形。 这种方法虽然在类中有很少的ActionListeners; 然而,现在这个课程变得难以管理。

我知道,为了封装,最好在用户界面类中使用ActionListener,因为它需要访问接口的非静态组件。 但是,封装和可读性之间似乎存在冲突。

我提议的是将类拆分为接口的一个类,将ActionListener的第二个类打破,并静态访问接口组件。 我想知道的是,这是遵循基本的设计惯例吗? 并且,如果这是一种可接受的方法,您会将主类放在用户界面类或ActionListener类中吗?

这不是一个重复的问题……但我的回答应该有助于你的问题 。

简短的总结,我的首选是让JFrame类不实现ActionListener,然后有一些带有JFrame的命名内部类,它们实现了ActionListener。

我会将主要的东西放在一个类中……并称之为Main。

以下是我喜欢的方式的示例代码:

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

然后是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); } }