私は 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 の方が適していると判断したようです。しかし、彼らのアプローチからいくつかのデザインのアイデアを得ることができるかもしれません。