WindowBuilder for Swing は、チェックボックスをローカル変数として作成し、テキストボックスをメンバー データとして作成します。この矛盾が私を悩ませました。いずれにせよ、すべてがトップレベルの JFrame にリンクされるため、これらのウィジェットは、JFrame がそれらへの参照を持っている限り確実に存続するため、テキストボックスがメンバー データである必要はないようです。テキストボックスはチェックボックスと同じようにローカルであるべきだと私には思えます。ローカルの方がカプセル化が優れています。ローカル参照は、WindowBuilder によって生成された GUI オブジェクト (JFrame を拡張するクラス) コンストラクターの最後で終了する可能性があり、JFrame は引き続きすべてのウィジェットへの参照を保持します。
それらをローカルにし、これらのウィジェット宣言の前に「final」を配置して、イベント ハンドラーの匿名内部クラス内で使用できるようにすることが、それらを機能させるために必要なことでした。また、テキストボックスがすべてメンバーとして宣言されている場合、テキストボックスのインスタンス化の順序は問題にならないため、順序を少し変更する必要がありました。ローカルでは順序が重要なので、「新しい」演算子 (インスタンス化) の使用をローカル スコープの上部に少し移動する必要がありました。それらは、それらを使用するイベント ハンドラーの北にある必要がありました。
これまでのところ、結果としてバグは見つかっていないので、なぜ WindowBuilder が最初からこのようにしなかったのかを尋ねています。私は Swing と WindowBuilder を初めて使用するので、私の場合には正しいアプローチのように見えても、WindowBuilder がこれを行わない大きな理由がある可能性が高いです。
以下は、いくつかの些細な名前の変更後、上記の変更前の WindowBuilder の出力です。これは、2 つのテキストボックス、2 つのチェックボックス、北に 2 つのボタン、中央に 1 つのラベルがあるそのままの出力です。これは、WindowBuilder によるメンバー データの使用の背後にある選択を説明する可能性のある何かを誰かがここで見ることができる場合に備えて、ここに貼り付けられています。
public class TestWB extends JFrame
{
private static final long serialVersionUID = 1L;
private JPanel contentPane;
private JTextField textBox1;
private JTextField textBox2;
public TestWB() // the constructor
{
... // see the constructor below
}
}
上記のクラスのコンストラクター:
public TestWB()
{
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setBounds(100, 100, 646, 451);
contentPane = new JPanel();
contentPane.setBorder(new EmptyBorder(5, 5, 5, 5));
contentPane.setLayout(new BorderLayout(0, 0));
setContentPane(contentPane);
JPanel northPanel = new JPanel();
contentPane.add(northPanel, BorderLayout.NORTH);
JButton button1 = new JButton("button1");
button1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent arg0) {
}
});
northPanel.add(button1);
JButton button2 = new JButton("button2");
button2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
northPanel.add(button2);
final JCheckBox checkBox1 = new JCheckBox("cb1");
checkBox1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CbProcessor cbp = new CbProcessor();
cbp.dealWithCb(checkBox1.isSelected(), textBox1);
}
});
northPanel.add(checkBox1);
final JCheckBox checkBox2 = new JCheckBox("cb2");
checkBox2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
CbProcessor cbp = new CbProcessor();
cbp.dealWithCb(checkBox2.isSelected(), textBox2);
}
});
northPanel.add(checkBox2);
textBox1 = new JTextField();
textBox1.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
textBox1.setText("tb1");
northPanel.add(textBox1);
textBox1.setColumns(5);
textBox2 = new JTextField();
textBox2.addActionListener(new ActionListener() {
public void actionPerformed(ActionEvent e) {
}
});
textBox2.setText("tb2");
northPanel.add(textBox2);
textBox2.setColumns(5);
JPanel centerPanel = new JPanel();
contentPane.add(centerPanel, BorderLayout.CENTER);
JLabel label1 = new JLabel("label1");
centerPanel.add(label1);
}