web-dev-qa-db-ja.com

Java JPanelコンポーネントを取得

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

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

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

TextField.getText();

ありがとう

15
Devoted

彼ら自身がそこにたどり着かなかったことをよく覚えておいてください(実行時にこれらのパネルを動的に作成することについてのいくつかの質問を読んだと思います)

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

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

簡単ではなかったですか?

これらの種類のアーティファクト(リスト)はできるだけプライベートにしておくことを忘れないでください。それらはあなたのコントロールのためだけのものであり、私はそれらがインターフェースに属しているとは思わない。

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

 public List<JTextField> getFields();

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

 public List<String> getTexts(); // get them from the textfields ... 
11
OscarRyz

JavaのすべてのJPanelもAWTコンテナです。したがって、getComponentsを使用して、パネルに含まれるコンポーネントの配列を取得し、それらを反復処理して、それらのタイプを確認できるはずです(あなたは他のコントロールを手に入れませんでした)、そしてあなたがそれらで必要なことは何でもします。

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

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

10
Uri

これが返す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);
    }
}
3
Akros

これは、コンテナを再帰的に調べて、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());
3
NetCollector
    //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);
        }
    }
2
cardaba713

作成時に動的に名前を付けてから、これを実行します。

    Component[] components = panel.getComponents();
    for (Component component: components) {
        var name = component.getName();  
        if(name != null){    
            if(name.equals("textfield 1")){
                var field = (JTextField)component;
                field.setText("whatever you want / same for options and other components")
            }
        }

    }
2
Nico

あなたの問題は退屈なコードテキストを書くことです。生成してプログラムに貼り付けてみませんか!! ...

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("JTextField tf"+i+" = new JTextField()"+";");
   System.out.println("points.add(tf"+i+")"+";");
}

上記のコードの出力をプログラムに貼り付けると、完了です。これで、テキストフィールドのコンテンツにアクセスするために、同様の方法で面倒なコードテキストを生成できます。

for(int i=1 ; i<=maxpoints ;i++){
   System.out.println("String s"+i+" = JTextField tf"+i+".getText()"+";");
}
0
Deepeshkumar