سؤال

ولدي JPanel مليئة JTextFields ...

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

وكيف يمكنني في وقت لاحق الحصول على JTextFields في هذا JPanel؟ مثل إذا أريد قيمهم مع

TextField.getText();

والشكر

هل كانت مفيدة؟

المحلول

وحسنا أن تضع في اعتبارها أنها لم تحصل هناك من أنفسها (اعتقد ان قراءة بعض الأسئلة حول إنشاء حيوي هذه اللوحات في وقت التشغيل)

في الأجوبة نشرت هناك، قال أحدهم يجب عليك الاحتفاظ إشارة إلى تلك الحقول النصية في صفيف. هذا هو بالضبط ما تحتاجه هنا:

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 ... 

نصائح أخرى

وكل JPanel في جاوة هو أيضا وعاء AWT. وبالتالي، يجب أن تكون قادرا على استخدام getComponents للحصول على مجموعة من المكونات الموجودة في لوحة، أعاد عليهم، تحقق أنواعها (للتأكد من أنك لم تحصل على عناصر التحكم الأخرى)، والقيام بكل ما تحتاج معهم.

ولكن، وهذا هو عموما سوء التصميم. إذا كنت تعرف أنك لن تحتاج إلى الوصول إلى عناصر محددة، فمن الأفضل للحفاظ على مجموعة من تلك الحقول النص وتمريرها حولها، على الرغم من أنها ترد بصريا داخل الحاوية.

وإذا كانت هذه هي مهمة متكررة أو يمكن القيام به من نقاط متعددة، قد جعل حتى من المنطقي أن يكون فئة خاصة تمثل لوحة مع حقول النص، من شأنها أن ثم تقدم من خلال وسائل واجهة من الوصول إلى هذه المجالات.

ويجب استدعاء الأسلوب 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);
    }
}

وهذا هو ما فعلته للذهاب بشكل متكرر من خلال الحاويات والحصول على الحقول النصية التي هي على 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());
    //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);
        }
    }

وإعطاء ديناميكية اسما أثناء إنشاء ومن ثم القيام بذلك.

    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")
            }
        }

    }

ومشكلتكم هو كتابة نص رمز مملة. لماذا لا تولد ولصقها في البرنامج !! ...

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()"+";");
}
مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top