これらのオブジェクト間の結合を減らす必要があります。
すべてのテキストフィールドとボタンを所有するマスターオブジェクトを持つことができます(パネルは無関係です)
次に、そのマスターオブジェクト内の個別のアクションリスナー(私はそれをメディエーターと呼びます。メディエーターパターンを参照してください)
そのアクションリスナーはメディエーターでメソッドを実行し、メディエーターはテキストフィールドから値を取得して、おそらく転送オブジェクトを作成します。
このようにして、パネルやテキストフィールドなどの間の結合を減らし、コントロールを1つの場所(メディエーター)に配置します。つまり、お互いに通知しません。
あなたはこの質問のコードを見ることができます:
https ://stackoverflow.com/questions/324554/#324559
コードを実行する際のこれらの概念を示しています。
ところで、オブザーバーパターンはすでにJTextField、JButton、ActionListenerなどに実装されています。フックを追加するだけです。
これがお役に立てば幸いです。
編集2つの答えを1つに結合しました。
これがコードです。
class App { // this is the mediator
// GUI components.
private JFrame frame;
private JTextField name;
private JTextField count;
private JTextField date;
// Result is displayed here.
private JTextArea textArea;
// Fired by this button.
private JButton go;
private ActionListener actionListener;
public App(){
actionListener = new ActionListener(){
public void actionPerformed( ActionEvent e ){
okButtonPressed();
}
};
}
private void okButtonPressed(){
// template is an object irrelevant to this code.
template.setData( getData() );
textArea.setText( template.getTransformedData() );
}
public void initialize(){
frame = new JFrame("Code challenge v0.1");
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
name = new JTextField();
count = new JTextField();
date = new JTextField();
textArea = new JTextArea();
go = new JButton("Go");
go.addActionListener( actionListener ); // prepare the button.
layoutComponents(); // a lot of panels are created here. Irrelevant.
}
}
完全で実行中のコードは、次の場所で取得できます。
可能であれば、継承よりも構成を優先することが重要です。