2

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

2 に答える 2

6

これは、WindowBuilder のドキュメントを読むことで質問に簡単に答えられるケースです。WindowBuilder は、任意の方法でコードを生成します。ウィジェットは、すべてローカル変数、すべてフィールド、またはその間の任意の組み合わせにすることができます。さまざまなウィジェットの範囲を個別に、またはタイプごとに (デフォルトを設定することにより) 制御できます。実際、WindowBuilder には非常に豊富なコード生成設定が用意されており、必要なほぼすべてのコード生成スタイルを複製できます。また、どんなコードでも喜んでリバース エンジニアリングするので、生成されたコードに (手動またはツールを使用して) 必要な変更を加えることができ、完全に満足したままになります。

Swing コード生成設定

Swing 変数の設定

于 2011-09-28T02:34:29.850 に答える
1

WindowBuilder については何も知りませんが、SWT と SimpleDesktopAplication FrameWorks については少し知っていますが、

1) どちらも AWT (SWT の一部) と Swing に基づいています

2) どちらも標準の AWT と Swing のメソッドをオーバーライドします

3) 場合によっては、フレームワークのメソッドから標準の AWT および Swing のメソッドに戻るのが難しすぎる

最初は基本的なSwingを学ぶことをお勧めしますが、

于 2011-09-21T09:34:04.533 に答える