1

GUI デザイナーの JPanel 内で独自の JPanel を初期化しましたが、ボタンをクリックしても、この JTextField を新しく作成した JPanel に追加できないようです。エラーは発生していません。再検証、検証、再描画などを試しました。別のユーザーから提案されたように、レイアウトを BoxLayout としてパネルに設定しましたが、それでも機能しませんでした。

fieldsPanelGUIデザイナーを使用して作成されていますが、オーバーライドしようとしています。

panelに追加したい自分のコードですfieldsPanel

public class Form extends JFrame {

private JPanel rootPanel;
private JPanel fieldsPanel;
private JPanel panel;

public Form() {
    fieldsPanel = new JPanel();
    panel = new JPanel();
    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));

    setContentPane(rootPanel);

    pack();

    addFieldButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JTextField skuField = new JTextField();
            panel.add(skuField);
            fieldsPanel.add(panel);
            pack();
            repaint();
        }
    });

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

    setVisible(true);
}
4

1 に答える 1

1

まず、GUI デザイナーについてコメントします。GUI デザイナーは、RAD や、コーディングはできるが、一度限りの GUI プロジェクトを行う必要がある GUI 開発の経験がほとんどない人に最適です。他のすべてのケース、およびおそらく最後に挙げたケースでさえ、NetBeans や IntelliJ に見られるようなデザイナー ツールではなく、コードのみを使用して GUI 開発を行う方法を学ぶ方が長期的な戦略として優れています。主な理由は、開発者から物事を隠すためです。そのため、何か問題が発生した場合、問題がどこにあるかを確認することができず、デバッグの最初の (そして最も重要な) ステップです。そのため、開発者はログ ファイルの実装とデバッガーを使用したプログラムのステップ実行に何時間も費やしています。そうは言っても、問題に:

IntelliJ は XML を使用して Java コードを生成します。デザイナー ツールを使用すると、XML がバックグラウンドで構築されます。プログラムを実行すると、メソッド呼び出しがあります

$$$setupUI$$$(MainView.java)

Java コードを作成します (この場合、MainView は JDialog を拡張します)。アイテムを手動で初期化する場合の正しい方法は、デザイナー ツールの [カスタム作成] ボックスをオンにすることです。

ここに画像の説明を入力

このボックスをオンにすると、コード内に createUIComponents というメソッドが作成されます。このメソッドでは、カスタム作成コードを追加できます。次に例を示します。

    private void createUIComponents() {
    // TODO: place custom component creation code here
     fieldsPanel = new JPanel();
     panel = new JPanel();
}

デザイナーと仕事をするときに覚えておかなければならないことは、彼らのルールに従わなければならないということです。提供された機能を使用します。最後に、createUIComponents メソッドは、このオブジェクトがスコープに入った瞬間に呼び出されます。

このパスをたどる場合、例を次のように変更する必要があります。

    public class Form extends JFrame {

private JPanel rootPanel;
private JPanel fieldsPanel;
private JPanel panel;

public Form() {

    panel.setLayout(new BoxLayout(panel, BoxLayout.Y_AXIS));
    setContentPane(rootPanel);
    pack();

    addFieldButton.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            JTextField skuField = new JTextField();
            panel.add(skuField);
            fieldsPanel.add(panel);
            pack();
            repaint();
        }
    });

    setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);    
    setVisible(true);
}

private void createUIComponents() {
        // TODO: place custom component creation code here
        fieldsPanel = new JPanel();
        panel = new JPanel();
    }
于 2014-05-20T10:42:13.820 に答える