GUI-Bedienelemente mit Zeiger/Referenzen-Array veralten

AndiB

Neues Mitglied
Hallo!

Ich komme aus der Objekt-Pascal-Welt und habe die allerersten Java-Schritte hinter mir (Java-Editor). Nun stoße ich aber auf ein kleines Problem, das eigentlich lösbar sein sollte, aber ich kriege es nicht hin und finde nichts dazu.

Im folgenden Code fülle ich 6 Textfelder mit 1, 2 usw. Sternchen. Dazu benutze ich ein Array, im dem Referenzen auf die Bedienelemente der GUI enthalten sind. Das klappt auch, aber das Anlegen der Referenzen muss doch auch mit einer Schleife möglich sein. Bei den 6 Textfeldern im Bsp. ist das ja noch OK, wenn ich aber ein Lottospiel mit 49 CheckBoxen angehen will scheint mit das Einrichten "per Hand" doch zu steinzeitlich zu sein.

public void jButton1_ActionPerformed(ActionEvent evt) {
int i;
JTextField [] Feld = new JTextField[6]; // In dieses Array sollen die Referenzen/Zeiger
StringBuffer hilfe = new StringBuffer();
String hilfe2;
Feld[0] = jTextField1; // Statt einzelner Zuweisungen hätte ich gerne eine Schliefe
Feld[1] = jTextField2;
Feld[2] = jTextField3;
Feld[3] = jTextField4;
Feld[4] = jTextField5;
Feld[5] = jTextField6;
for (i=0;i<=5;i++) {
hilfe.append("*");
hilfe2 = hilfe.toString();
Feld.setText(hilfe2);
} // end of for
} // end of jButton1_ActionPerformed

Die Namen der Bedienelemente "nachzubasteln" ist weniger das Problem. Wie kann ich dem Rechner aber klar machen, dass diese Namen Bedienelemente auf dem Formular sind und im Array Referenzen/Zeiger auf diese Elemente eingerichtet werden sollen.

In Objekt-Pascal klappt das in einer Schleife mit dem Befehl:

Feld := TEdit(FindComponent(NameDesEditFeldes));

Dabei legt FindComponent den Zeiger an und TEdit (= jTextField) ist erforderlich, damit das Programm weiß, was es findet um damit umgehen zu können.

Über Hilfe würde ich mich riesig freuen! Vielen Dank im Voraus!!
Andreas
 

Robat

Top Contributor
Du baust dir die GUI also mittels eines GUI-Builders zusammen. Hab ich das richtig verstanden?
Dann wäre ein Weg der mir spontan in den Sinn kommt folgender:

- Gib jedem JTextField einen Namen mit der jeweiligen Nummer im Array (Bsp: jtf0, jtf1, jtf2, ..)
- Hol dir den Container (bspw JPanel) auf welchem die JTextFields sitzen
- Iteriere über alle Components die auf dem Root-Container liegen, prüfe ob es sich um ein JTextField handelt und dann ob der Name die jeweilige ID enthält

Beispiel:

Java:
JPanel root = new JPanel(); // das hier muss dann dein Container vom Formular sein
JTextField[] fieldArray = new JTextField[4];
for(int i = 0; i < fieldArray.length; i++){
    fieldArray[i] = findTextFieldById(root, i);
}

private JTextField findTextFieldById(JComponent root, int id){
    for(Component comp : root.getComponents()){
       if(comp instanceof JTextField){
           if(comp.getName().contains(String.valueOf(id))){
              return (JTextField) comp;
           }
        }
    }
    return null;
}

Mit Java8 könnte man das ganze noch kürzen, wusste aber nicht mit welcher Version du arbeitest.

PS: Setze deinen Code nächstes mal bitte in [code=Java]MY CODE[/code] Tags.
 

AndiB

Neues Mitglied
Hallo Robat!
Ich habe jetzt zwei Wochen lang mit Deinem Vorschlag (vielen Dank dafür!) herumgedocktert, scheitere aber anscheinent daran, das der Code an einer Stelle das Formular nicht kennen will.

Java:
import java.awt.*;
import java.awt.event.*;
import javax.swing.*;
import javax.swing.event.*;

public class Versuch extends Frame {
  // Anfang Attribute
  private JTextField jTextField1 = new JTextField();
  private JTextField jTextField2 = new JTextField();
  private JTextField jTextField3 = new JTextField();
  private JTextField jTextField4 = new JTextField();
  private JTextField jTextField5 = new JTextField();
  private JTextField jTextField6 = new JTextField();
  private JButton jButton1 = new JButton();
  // Ende Attribute
 
  public Versuch(String title) {
    // Frame-Initialisierung
    super(title);
    addWindowListener(new WindowAdapter() {
      public void windowClosing(WindowEvent evt) { dispose(); }
    });
    int frameWidth = 300;
    int frameHeight = 300;
    setSize(frameWidth, frameHeight);
    Dimension d = Toolkit.getDefaultToolkit().getScreenSize();
    int x = (d.width - getSize().width) / 2;
    int y = (d.height - getSize().height) / 2;
    setLocation(x, y);
    setResizable(false);
    Panel cp = new Panel(null);                           // Entspricht dies Diener Zeile "JPanel root =
                                                                       // new JPanel();"? Wieso "null"???
    add(cp);
  
    // Anfang Komponenten
  
    jTextField1.setBounds(16, 32, 150, 20);
    cp.add(jTextField1);
    jTextField2.setBounds(16, 64, 150, 20);
    cp.add(jTextField2);
    jTextField3.setBounds(16, 96, 150, 20);
    cp.add(jTextField3);
    jTextField4.setBounds(16, 128, 150, 20);
    cp.add(jTextField4);
    jTextField5.setBounds(16, 160, 150, 20);
    cp.add(jTextField5);
    jTextField6.setBounds(16, 192, 150, 20);
    cp.add(jTextField6);
    jButton1.setBounds(192, 88, 75, 25);
    jButton1.setText("jButton1");
    jButton1.setMargin(new Insets(2, 2, 2, 2));
    jButton1.addActionListener(new ActionListener() {
      public void actionPerformed(ActionEvent evt) {
        jButton1_ActionPerformed(evt);
      }
    });
    cp.add(jButton1);
    addWindowListener(new WindowAdapter() {
      public void windowOpened(WindowEvent evt) {
        versuch_WindowOpened(evt);
      }
    });
    addWindowListener(new WindowAdapter() {
      public void windowActivated(WindowEvent evt) {
        versuch_WindowActivated(evt);
      }
    });
    // Ende Komponenten
    setVisible(true);
  } // end of public Versuch
 
  // Anfang Methoden
 
  public static void main(String[] args) {
    new Versuch("Versuch");
  } // end of main
 
  private JTextField findTextFieldById(JComponent cp, int id) {
    for (Component comp : cp.getComponents()) {
      if (comp instanceof JTextField) {
        if (comp.getName().contains(String.valueOf(id))) {
          return (JTextField) comp;
        }
      }
    } // end of for
  }
 
  public void jButton1_ActionPerformed(ActionEvent evt) {
    int i;
    JTextField[] fieldArray = new JTextField[6];
    StringBuffer hilfe = new StringBuffer();
    String hilfe2;
    for (int j=1; j<fieldArray.length; j++) {
      fieldArray[j] = findTextFieldById(cp, j);                           // "Error: cannot find symbol", stoppt bei "cp"
    } // end of for
    for (i=0;i<=5;i++) {
      hilfe.append("*");
      hilfe2 = hilfe.toString();
      fieldArray[i].setText(hilfe2);
    } // end of for
  } // end of jButton1_ActionPerformed
  // Ende Methoden
} // end of class Versuch

Ich habe versucht, statt des Namen des Panels den des Formulars ("V/versuch") zu verwenden - ohne Erfolg.
Und noch etwas ist mir vollkommen unverständlich: Weshalb darf ich in der Methode "public void jButton1_ActionPerformed" den Zähler j nicht initialisieren, während ich i initialisieren muss? Undwarum kann ich i nicht zweimal verwenden? Die beiden Schleifen sind ganz klar getrennt.

Ich hoffe, ich habe den Code jetzt richtig drin - ich bin vor den Foren groß geworden. :)

Gruß und Dank
Andreas
 

Robat

Top Contributor
den Zähler j nicht initialisieren, während ich i initialisieren muss? Undwarum kann ich i nicht zweimal verwenden?
Die Fragen verstehe ich nicht ganz. In deinem Code gibt es keine Stelle wo das zutreffen würde. Bei beiden Schleifen initialisierst du deinen Zähler.
Du kannst i 2 mal verwenden. Das sollte kein Problem sein. Zeig doch mal den Code wo es nicht geklappt hat.

So wie dein Code jetzt ist wird das ganze nicht funktionieren. Du musst den JTextFields die du finden willst mittels setName() noch die ID zuweisen. Ansonsten wird deine Methode findJTextfieldByID() kein ordentliches Ergebnis zurückliefern.


Off-Topic:
- momentan mischst du AWT und Swing - Komponenten. Grundsätzlich solltest du da aufpassen. Nutze lieber JFrame anstatt Frame.
 
Ähnliche Java Themen
  Titel Forum Antworten Datum
S Zählen der Zeiger auf Objekte Java Basics - Anfänger-Themen 35
8 Referenz (Pointer, Zeiger) in Java Java Basics - Anfänger-Themen 9
G Array-Zeiger auf null und if() Java Basics - Anfänger-Themen 4
H Zeiger auf das letzte Element in einer linearen Liste Java Basics - Anfänger-Themen 4
P Zeiger und Listen Java Basics - Anfänger-Themen 2
D Null-Zeiger Java Basics - Anfänger-Themen 9
Screen Mouserobot clonen? Zeiger nur innerhalb eins Fensters? Java Basics - Anfänger-Themen 3
G Keine feste Länge bei Objekten, warum nur Zeiger? Java Basics - Anfänger-Themen 8
M Doppelt verkettete Liste Zeiger Vorgänger beim Einfügen Java Basics - Anfänger-Themen 2
G Zeiger/Referenz auf int- Variable Java Basics - Anfänger-Themen 5
K Hab ich dass so richtig erklärt (Objekte und Referenzen)? Java Basics - Anfänger-Themen 5
B Erste Schritte Frage zu Instanzierung und Referenzen Java Basics - Anfänger-Themen 8
M Referenzen zuweisen und wird gleichzeitig ausgeführt Java Basics - Anfänger-Themen 6
B JaxB - Unique Name updaten / Referenzen in XML Java Basics - Anfänger-Themen 0
B Objekt kopieren und sämtliche Referenzen von diesem Objekt? Java Basics - Anfänger-Themen 3
B JaxB - Referenzen erstellen? Java Basics - Anfänger-Themen 2
Zrebna Frage zum "Referenzen-konzept" in Java Java Basics - Anfänger-Themen 8
B Datenbank: Entity mit vielen Referenzen? Ansatz so ok? Java Basics - Anfänger-Themen 8
scratchy1 Referenzen Java Basics - Anfänger-Themen 32
O Referenzen Java Basics - Anfänger-Themen 2
A Variablen Verständnisfrage bzgl. Variablen/Referenzen Java Basics - Anfänger-Themen 3
A Variablen Referenzen Java Basics - Anfänger-Themen 6
K Operatoren 2D Int Array auf Null-Referenzen prüfen Java Basics - Anfänger-Themen 18
F Referenzen zwischen Methoden Java Basics - Anfänger-Themen 5
T Klassen Referenzen auf Klassen / Objekte Java Basics - Anfänger-Themen 5
J OOP Ein Fahrrad - zwei Besitzer: Zwei Referenzen auf ein Objekt Java Basics - Anfänger-Themen 43
C Referenzen zu Instanzen einer Klasse im Array Java Basics - Anfänger-Themen 8
K Collections Auf Referenzen in ArrayList zugreifen? Java Basics - Anfänger-Themen 3
B ArrayList.clear - Daten in allen Referenzen weg Java Basics - Anfänger-Themen 2
L Grundlegende Verständnisfrage Hasmap Referenzen Java Basics - Anfänger-Themen 4
C OOP Referenzen-Problem Java Basics - Anfänger-Themen 3
N Referenzen Problem Java Basics - Anfänger-Themen 2
K Referenzen - 2ter Versuch Java Basics - Anfänger-Themen 17
M Instanzen, Referenzen und Collections Java Basics - Anfänger-Themen 3
C Referenzen in Java Java Basics - Anfänger-Themen 11
J Referenzen vergleichen Java Basics - Anfänger-Themen 8
M Referenzen verschieben Java Basics - Anfänger-Themen 2
J Mehrere Referenzen auf ein Objekt Java Basics - Anfänger-Themen 6
M Referenzen Java Basics - Anfänger-Themen 11
G Netzwerk: RMI Objekt-Referenzen Java Basics - Anfänger-Themen 2
I clone() und Referenzen Java Basics - Anfänger-Themen 25
A Referenzen zu festen Werten machen? Java Basics - Anfänger-Themen 5
F Referenzen Java Basics - Anfänger-Themen 7
H Problem mit Events bzw. Referenzen Java Basics - Anfänger-Themen 4
M Zugriff auf Textfelder über Referenzen? Java Basics - Anfänger-Themen 3
F ArrayList! Pointer, Referenzen! Java Basics - Anfänger-Themen 4
K Verständnisfrage Collection, ArrayList und Referenzen Java Basics - Anfänger-Themen 4
H Begriff: Objekt enthält Referenzen Java Basics - Anfänger-Themen 3
J Referenzen Java Basics - Anfänger-Themen 5
P HashSet und Referenzen Java Basics - Anfänger-Themen 9
G Speicherung von Referenzen auf Instanzen Java Basics - Anfänger-Themen 5
T Referenzen. Java Basics - Anfänger-Themen 5
Z Referenzen in LinkedList Java Basics - Anfänger-Themen 3
F Referenzen in Java - Fehlerpotenzial ! Java Basics - Anfänger-Themen 5
G Instanzen und Referenzen Java Basics - Anfänger-Themen 5
G array auf null-referenzen überprüfen ! Java Basics - Anfänger-Themen 9
G Referenzen Java Basics - Anfänger-Themen 5

Ähnliche Java Themen

Neue Themen


Oben