2011-12-19 11 views
0

申し訳ありません。私の英語のために、私は十分ではありません。Jbuttonのアクションでクロスレフェンス

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

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

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。

答えて

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

あなたはまた、むしろ、コンストラクタでそれを呼び出すよりも、アクションのactionPerformedメソッドにfenetre.getTextFieldList()を呼び出すことができます。

+0

ご回答ありがとうございます。したがって、相互参照を持つのは正常です。最もクリーンな方法をありがとう、私はそれを使用すると思う。 – Shoxolat