我承认我从事 Web 开发,所以我对 Swing 没有太多经验。
但我一直认为我的处理方式是将应用程序分解为 /view、/model 和 /controller 包。这些关系将是单向的:/controller 将知道 /model 和 /view,但两者都不会从 /controller 或彼此导入任何类。
/view 层组件永远不会是 JFrame;它们总是 JPanel 或其他可以根据需要组合成 JFrame 的合适容器。每个都会引用 Listener 接口,在构造函数中初始化,并且会遵循这些接口进行事件处理:
public class ExamplePanel extends JPanel implements ActionListener
{
private JButton button;
private ActionListener buttonListener;
public ExamplePanel(ActionListener buttonListener)
{
this.button = new JButton("Do Something");
this.buttonListener = buttonListener;
this.button.addListener(this.buttonListener);
}
public void actionPerformed(ActionEvent e)
{
this.buttonListener.actionPerformed(e);
}
}
这种安排与依赖注入配合得很好,因为现在控制器可以选择使用该侦听器接口的本地或远程实现,以完全不影响客户端的方式更改行为。
我承认我从来没有一直遵循它。
Spring 的人有一个丰富的 Swing 客户端模块,但它似乎已经失宠了。看起来他们已经决定 BlazeDS 方向是富客户的更好选择。但也许你可以从他们的方法中收集到一些设计理念。