18

私はJTextFieldsでいっぱいのJPanelを持っています...

for (int i=0; i<maxPoints; i++) {
    JTextField textField = new JTextField();
    points.add(textField);
}

その JPanel で JTextFields を後で取得するにはどうすればよいですか? 私は彼らの値が欲しい場合のように

TextField.getText();

ありがとう

4

7 に答える 7

12

Java のすべての JPanel も AWT コンテナーです。したがって、 getComponents を使用して、パネルに含まれるコンポーネントの配列を取得し、それらを反復処理し、それらのタイプをチェックし (他のコントロールを取得していないことを確認するため)、必要なことを行うことができます。

ただし、これは一般的に貧弱な設計です。特定のコンポーネントにアクセスする必要があることがわかっている場合は、これらのテキスト フィールドの配列を保持して渡しておくことをお勧めします。たとえそれらがコンテナ内に視覚的に含まれていたとしてもです。

これが反復的なタスクであるか、複数のポイントから実行できる場合は、テキスト フィールドを含むパネルを表す特別なクラスを用意することも理にかなっています。このクラスは、インターフェイスを介してこれらのフィールドにアクセスする手段を提供します。

于 2008-12-16T02:30:56.747 に答える
11

彼らは自分たちでそこにたどり着いたわけではないことに注意してください(実行時にこれらのパネルを動的に作成することに関するいくつかの質問を読んでいると思います)

そこに投稿された回答で、配列内のこれらのテキストフィールドへの参照を保持する必要があると誰かが言いました。それはまさにあなたがここで必要なものです:

List<JTextField> list = new ArrayLists<JTextField>();

// your code...
for (int i=0; i<maxPoints; i++) { 
    JTextField textField = new JTextField();
    points.add(textField);
    list.add( textField ); // keep a reference to those fields.
}

// 後で

for( JTextField f : list ) { 
   System.out.println( f.getText() ) ;
}

それは簡単ではありませんでしたか?

これらの種類のアーティファクト ( list ) はできるだけ非公開にすることを忘れないでください。それらはあなたの制御のみを目的としており、インターフェースに属しているとは思いません。

代わりに、テキストの配列を取得したいとしましょう

 public List<JTextField> getFields();

次の点を考慮する必要があります。

 public List<String> getTexts(); // get them from the textfields ... 
于 2008-12-16T02:50:50.280 に答える
4

これは、コンテナーを再帰的に通過し、JPanels にあるテキストフィールドを取得するために行ったことです。

private void ClearAllFields(Container myContainer) {

    Component myComps[] = myContainer.getComponents();

    for (int i=0; i<myComps.length; i++) {
      if(myComps[i] instanceof JPanel) {
          JPanel myPanel = (JPanel) myComps[i];
          ClearAllFields(myPanel);
      }
      if(myComps[i] instanceof JTextField) {
        JTextField myTextField = (JTextField) myComps[i];
        myTextField.setText("");
      }
    }        
}

そして、それを使用するには、このように呼び出します

ClearAllFields([jdialog or jframe etc].getContentPane());
于 2017-10-11T17:32:26.043 に答える
3

これが返す getComponents メソッドを JPanel のすべての要素の配列で呼び出す必要があります。配列を反復処理して、求められているコンポーネントと等しいかどうかを確認した後。

List<JTextField> list = new ArrayLists<JTextField>();
Component[] components = panel.getComponents();

for (Component component : components) {
    if (component.getClass().equals(JTextField.class)) {
        list.add((JTextField)component);
    }
}
于 2015-11-20T12:12:02.130 に答える
2
    //una forma de recorer todos los elementos dentro de un jpanel
    Component[] components = jPanelX.getComponents();

    for (int i = 0; i < components.length; i++) {

        if(components[i].getClass().getName().toString().equals("javax.swing.JTextField")){
            components[i].setEnabled(false);
        }
    }
于 2013-04-13T16:53:44.170 に答える