3

jpanel からコンポーネントを削除する方法。以下のコードでは、val に応じてテキストフィールドが作成されます。これは作成に問題なく機能しています。ただし、スピナーで値を下げると、テキストフィールドも縮小されるはずです。

配列 txtField からすべてのコンポーネントを削除しようとしましたが、機能しませんでした。

int val = (int) textFieldGen.getModel().getValue(); //getting the value from JSpinner

JTextField[] txtField = new JTextField[val]; 

//tried panel.revalidate(); panel.repaint();

//removing elements if exists.  gives null pointer exception.  

try {
     for (JTextField txtComp : txtField) {
       panel.remove(txtComp);
    }
} catch (Exception ex) {
        System.out.println(ex);
}

panel.revalidate();
panel.repaint();


//creating    
int row = 1;
for (int i = 0; i < txtField.length; i++) {
    row++;           
    layout.appendRow(RowSpec.decode("30px"));
    txtField[i] = new JTextField(10);
    panel.add(txt[i], cc.xy(4, row));
}
panel.revalidate();
panel.repaint();
4

3 に答える 3

5

remove(...)「パネル」JPanel で呼び出している場所がわからないため、JTextFields を削除する方法がわかりません。いくつかの提案:

  • 提案している現在のルートに進む必要がある場合は、GridLayout に JTextFields を保持し、他のコンポーネントを保持しない単一の専用コンテナー JPanel を使用します。
  • 新しいコンポーネントを追加する前にすべてのコンポーネントを削除します (それが必要な場合)
  • revalidate()削除と追加の後、コンテナー JPanel で両方と 'repaint()' を呼び出します。
  • 代わりに、行を追加または削除するだけの JTable を使用することを検討してください。私の考えでは、これがこのような問題に対する最も簡単でクリーンな解決策です。
于 2012-09-18T01:01:42.390 に答える
2

JTextField[] txtField = new JTextField[val];

この行は配列を初期化せず、val のカウントで配列を作成するだけです。要素はデフォルトで nullNullPointerExceptionであるため、for-each ループで配列を反復すると がスローされます。

JTextField有効なオブジェクトで配列を初期化する必要があります。

于 2012-09-18T02:53:29.433 に答える
2

必要な s の数を受け入れるメソッドを単純に用意し、適切なレイアウトとすべてに既に追加されている必要な s の正しい数で をJTextField返すようにしないでください。JPanelJTextFieldJPanel

public JPanel createPanel(int numberOfTextFields) {
    JPanel panel=new JPanel(new ...);//create new panel

    JTextField tfs[]=new JTextField[numberOfTextFields];//create array of textFields

    for(int i=0;i<numberOfTextFields;i++) {
        tfs[i]=new JTextField();//create the textfield
        panel.add(tfs[i]...);//add it to the panel
    }

    return panel;
}

s contentPaneJPanelから最後を削除するだけです。JFrame

JFrameまたは、を使用して再度空にしgetContentPane().removeAll(); 、それに新しいJPanelを追加し、ユーザー コントロールJPanelを含むを追加しますが、ユーザー コントロールパネルを毎回再作成する必要はありません。

于 2012-09-18T09:12:45.800 に答える