MVCアーキテクチャパターンを使用して単純なJavaSwingアプリケーションを構築しようとしています。私が行ったことは、ビューにユーザーインターフェイスコンポーネントを(プライベートとして)作成し、コンポーネントを返すパブリックメソッドを使用することです。これらのメソッドはコントローラーによって呼び出され、イベント/アクションリスナーのメソッドを記述できます。以下にサンプル例を示します。
意見:
private JButton btnAdd;
public JButton getBtnAdd(){
return btnAdd;
}
コントロール:
myGuiFrame gui = new myGuiFrame();
//on add button clicked
gui.getBtnAdd().addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
//calls to model
}
});
この実装は正しいですか?
もしそうなら、私はFocusListenersに問題があります。ビューでFocusListenerを作成すると、focusLostメソッドとfocusGainedメソッドがビュー内に作成されます。
private FocusListener l;
someComponent.addFocusListener(l);
l = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
}
};
すべてのイベントハンドラーをコントローラーに配置したいと思います。私の質問は...コントローラーからfocusLostメソッドとfocusGainedメソッドを呼び出し/宣言する方法はありますか?コントローラで定義できるように、FocusListenerをパブリックとして定義しようとしました。
見る:
public FocusListener l;
public someComponentType someComponent;
コントローラ:
gui.l = new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
gui.someComponent.addFocusListener(gui.l);
}
};
ただし、これは機能しません。
コントローラからFocusEventsを処理することは可能ですか?
編集:
おやおや、私の悪い。ロビンが何であるかを完全に理解していませんでした。私はFocusListenerをどこかに明示的に定義することに固執しすぎました。シンプルな:
gui.getTextFieldEmployeeCode().addFocusListener(new FocusListener() {
@Override
public void focusLost(FocusEvent e) {
// TODO Auto-generated method stub
}
@Override
public void focusGained(FocusEvent e) {
// TODO Auto-generated method stub
System.out.println("YES!!!");
}
});
コントローラーでは、私が計画した方法で問題なく動作しますが、nIcEcOwがそれをどのように処理したかは非常に気に入っています。好奇心から、SwingアプリにMVCを実装する標準的な方法または広く受け入れられている方法はありますか?