0

私の英語でごめんなさい、私は十分ではありません。

さて、現時点では、コードに相互参照があるため、概念の問題があります。他に何かできるかどうか知りたいです。

私はフレームを持っています:

public class JFrameVcView extends JFrame {
       ...
        private void init() {
              ...
              JButton jButtonFilter = new JButton(new FilterAction(this, "Filter"));
              ...
       }
  }

私のFilterActionクラスは次のように見えます:

public class FilterAction extends AbstractAction {
private final JFrameVcView fenetre;
private final List<JTextField> textFieldList;

public FilterAction(JFrameVcView fenetre, String texte) {
super(texte);
this.fenetre = fenetre;
this.textFieldList = fenetre.getTextFieldList();
}

@Override
public void actionPerformed(ActionEvent e) {
for (JTextField jtf : textFieldList) {
    System.out.println("name : " + jtf.getName() + " value : " + jtf.getText());
}
}

}

ご覧のとおり、私のアクションはJFrameVcViewの参照を取得しますが、このアクションを呼び出すのはJFrameVcViewです。ですから、それは良い解決策ではないと思います。ちなみに、ブロックされているのですが、どうすればいいのかわかりません。

ありがとう。Shoxolat。

4

1 に答える 1

0

そのようなコールバック参照を持つことは一般的です。たとえば、匿名の内部クラスが使用されるたびに、匿名のActionListenerインスタンスは、アクションを構成するJFrameまたはJPanelである外部クラスに暗黙の参照を持ちます。

問題は、アクションのコンストラクターがJFrameの要素にアクセスしようとしていることです。これらの要素は、構築段階にあるため、まだ使用できません。

最もクリーンな方法は、おそらくフレームを作成することです。フレームが完全に作成されたら、フレームを参照するすべてのアクションを作成します。このようにして、使用する前にフレームをエスケープしないようにします。

private JFrameVcView () {
    // calls the init() method which creates all the components
}

private void createActions() {
    // create the actions and sets them on the buttons.
}

public static JFrameVcView createFrame() {
    JFrameVcView view = new JFrameVcView(); // calls the init() method which creates all the components
    view.createActions(); // when this method is called, the frame has all its buttons
    return view;
}

fenetre.getTextFieldList()コンストラクターで呼び出すのではなく、アクションのactionPerformedメソッドを呼び出すこともできます。

于 2011-12-19T10:15:27.213 に答える