Du verwendest einen veralteten Browser. Es ist möglich, dass diese oder andere Websites nicht korrekt angezeigt werden. Du solltest ein Upgrade durchführen oder ein alternativer Browser verwenden.
Ich habe eine Maske mit sehr vielen Eingabefeldern (Textfelder und Combo-Boxen). Nun möchte ich alle Inhalte der Eingabefelder nachdem Betätigen eines Buttons löschen. Allerdings nicht alle einzeln.
Ich suche also eine Möglichkeit alle Felder der Maske zu durchlaufen und wenn es sich um ein Textfeld oder eine Combo-Box handelt, den Inhalt zu löschen.
Vielen Dank im voraus für Eure Hilfe und Vorschläge
Die Textfelder oder ComboBoxen müssen ja irgendwo drauf liegen, z. B. auf einem Panel.
Zum Panel kannst du sagen getComponent(), das gibt dir ein Component[] zurück mit allen Components, die das Panel enthält. Die kannste mit einer for-Schleife durchgehen und prüfst dann mittels instance of ob es sich um ein entsprechendes Feld handelt. Wenn ja Eingabe löschen, wenn nein nix machen.
JApplet a = new JApplet();
// Komponenten vom Applet holen
Component[] ca = a.getComponents();
// Alle Komponenten durch gehen
for (int i = 0; i < ca.length; i++) {
// Wenn instanceof JPanel (kann auch was anderes sein, wo immer deine Textfelder etc halt liegen
if (ca[i] instanceof JPanel) {
// Komponenten des Panels holen
Component[] cp = ((JApplet) ca[i]).getComponents();
for (int j = 0; j < cp.length; j++) {
// Wenn instanceof JTextField leeren
if (cp[j] instanceof JTextField) {
((JTextField) cp[j])....
// Wenn instanceof JComboBox leeren
} else if (cp[j] instanceof JComboBox) {
((JComboBox) cp[j])....
}
}
}
}
Der Code is nur ein ganz grobes Beispiel, lässt sich auch noch weiter verschachteln und is aus dem Kopf mal schnell so dahin geschrieben. Also keine Garantie für Lauffähigkeit und Richtigkeit.
Kann auch gut sein, dass es elegantere Lösungen gibt, ich wüsste jedoch jetzt direkt keine. Vielleicht könnte man sich alle Eingabefelder beim Erzeugen noch in eine List schreiben und beim Leeren nur noch diese List durch gehen. Alternativ könnte man auch ein JTextField[] und ein JComboBox[] machen. Keine Ahnung wie man das am besten löst. ???:L
Jau, die innere Schleife (alle Komponenten eines JPanels) funktioniert. Dafür schon mal vielen Dank. Allerdings kriege ich es nicht gebacken, alle Komponenten des Applets zu durchlaufen.
Hier mal mein Code (iihhh)
Code:
Component[] c = jPanel1.getComponents();
Component[] ca = this.getComponents();
int dws = c.length;
int dws1 = ca.length;
for(int i = 0;i < c.length; i++)
{
String hstr = c[i].getName();
if (c[i] instanceof JTextField)
{
((JTextField) c[i]).setText("");
}
else {
}
}
In dws1 steht immer eine "1". Ich habe aber 3 JPanel auf dem Applet liegen.
private void clearFields(Component c)
{
for (int i=0; i<c.getComponents().length; i++)
{
Component comp = c.getComponents()[i];
if (comp.getComponents().length > 0)
{
clearFields(comp);
}
if (comp instanceof JTextField)
{
((JTextField)comp).setText("");
}
}
}
Der Funktion übergibst Du einfach das Panel auf dem alles liegt bzw. dein Applet selbst und dann sollte das passen.
Ist aus dem Kopf geschrieben und nicht getestet, übernehme also keine Garantie auf Fehlerfreiheit.
Irgendetwas stimmt mit Deinem Code nicht. "c.getComponents" wird nicht erkannt und damit rot unterkringelt. Wenn ich die Komponenten eines Applets nicht durchlaufen kann, ist das nicht weiter tragisch, ich kann ja die JPanel einzeln durchlaufen. Das ist schon ok.
Kannst Du mir vielleicht noch sagen wie ich den Namen einer Komponente ermitteln kann. Wenn z.B. ein Label "lblPlz" heißt, wie kann ich dann diesen Namen abfragen? Ich möchte praktisch wie in meinem Beispiel angegeben den Text nur löschen, wenn der Name der Komponente mit "txt" anfängt.
Kann mir jemand meine zweite Frage beantworten, wie ich den Namen einer Komponente ermitteln kann. Wenn z.B. ein Label "lblPlz" heißt, wie kann ich dann diesen Namen abfragen? Ich möchte praktisch wie in meinem Beispiel angegeben den Text nur löschen, wenn der Name der Komponente mit "txt" anfängt.
Ich habe Labels, die ich als Anzeigefelder benutze (in die schreibe ich Text rein) und Labels, die den Namen der Anzeigefelder enthalten. Die Labels, die mir als Anzeigefelder dienen, habe ich lbltxtXXX genannt und die Labels, die die Namen enthalten lblXXX. Ich weiß, ich hätte für die lbltxtXXX auch Textfelder nehmen können :lol:.
wenn Deine Textfelder Labels sind (welchen Sinn auch immer das machen soll), dann wird der Code nicht funktionieren wie oben beschrieben. Dann musst natürlich auf JLabel - Components prüfen und casten.
Jup, wie Leroy42 schon geschrieben hat geht das nicht. Die einzige Möglichkeit, die du noch hast wäre im Konstruktor zu allen Laben setName(String) zu sagen, z. B.:
Code:
private JLabel lblPLZ = new JLabel();
...
...
lblPLZ.setName("lblPLZ"); // sowas dann am besten im Konstruktor
...
...
if (((JLabel) component).getName().equals("lblPLZ")) {
// Hier kannste dann was machen
}
Das ganze wäre dann aber (je nach Anzahl von Labels, auf deren Namen du prüfen willst) u. U. doch ziemlich umständlich.
Ich habe das jetzt anders gelöst. Und zwar unterscheide ich die Labels über die Style. Daran kann ich dann abfragen, ab der Inahlt gelöscht werden soll oder nicht.