textfeldwerte aus array lesen

annalena

Mitglied
hallo ihr lieben,
ich habe jetzt ein kleines thema..in einem frame laufen. dort wird im ersten abschnitt abgefragt wieviele spieler es werden (2-16) und im nächsten abschnitt liste ich mir dann dieses auf und kann die spieler durch ein textfield array bennen, nun stell sich mir die frage, wie ich nun an diese werte komme..damit ich sie übergeben kann und weiter damit arbeiten kann

Java:
public class TourMain extends JFrame implements ActionListener, ComponentListener
{
...
private JTextField[] playersText  = new JTextField[16];
private JLabel[]     playersLabel = new JLabel[16];
...
frame
...
@Override
  public void actionPerformed( ActionEvent e )
  {
    String str = String.valueOf( e.getActionCommand() );
    String player = displayText.getText();
    String team = displayText2.getText();
    int p = Integer.parseInt( player );
    switch( str )
    {
        for( int i = 0; i < p; i++ )
        {
          playersLabel[i] = new JLabel();
          playersLabel[i].setText( "Player " + i + ":" );
          playersLabel[i].setBounds( x, y, 135, 17 );
          this.add( playersLabel[i] );

          playersText[i] = new JTextField( "PlayerId: " + i );
          playersText[i].setBounds( x2, y, 135, 17 );
          playersText[i].addActionListener( this );
          this.add( playersText[i] );

          y += 20;
        }
        break;

      case "Start Game":
//UND HIERUM GEHTS, ICH BEKOMM NICHT DEN INHALT SONDERN
//ADRESSE UND ZUSTAND DES ARRAYS...NICHT DIE PLAYERID: ZAHL
        for( int i = 0; i < playersText.length; i++ )
        {
          System.out.println( playersText[i] );
        }
    }
  }
}
 
Naja, du versuchst ein Textfield auszugeben, dann bekommst du nur die "vorgefertigte" toString() Methode.
Du kannst natürlich auf dem TextField getText() aufrufen, also etwa:
Java:
for( int i = 0; i < playersText.length; i++ )
        {
          System.out.println( playersText[i].getText());
        }
 
mhh ich bekomm dabei ne null pointer exception..und weiß dann immernoch nicht so recht wie ich es dann zb in ein label schreiben kann..also die namen die ich ja aus dem textfeld habe
 
mhh ich bekomm dabei ne null pointer exception..
Dann gibt es einen Index dem kein JTextfield Objekt zugewiesen wurde.

Durch deine Anforderung (2-16 Spieler) kann es natürlich auch möglich sein das weniger als 16 Spieler angelegt werden.
Dann ist dein Array nicht vollständig gefüllt -> du musst abfragen ob auf entsprechenden Index ein Objekt zu finden ist.

Alternative: Statt einem Array eine Liste verwenden.

.... und weiß dann immernoch nicht so recht wie ich es dann zb in ein label schreiben kann..also die namen die ich ja aus dem textfeld habe
Die Methode "getText()" liefert dir den Text, welcher auf dem JTextfield steht.
Beispiel:
Java:
JLabel newLabel = new JLabel();
newLabel.setText(deinTextfield.getText());
 
Moin,

jetzt mal ganz dumm gefragt ... dieses Konstrukt hier läßt sich SO compilieren ??
Java:
switch( str )
{
    for( int i = 0; i < p; i++ )
    {
         // ...
    }
    break;

    case "Start Game":
    // ...

Gruß Klaus
 
@VfL_Freak aka Klaus..nein ich hab vieles aus dem code der zu meinem problem keine bewandtnis hat weggelessen..sonst haben wir hier 300 zeilen code und jeder muss sich mühseelig durcharbeiten um mein problem zu sehen...^^

das thema mit der liste hab ich noch nicht ganz verstanden..da wüsste ich kein lösungsansatz..hab das mal in c# gemacht mit listen..aber das ist auch schon sehr sehr lange her weiss also gar nichts mehr darüber -.-

und die nullpointer exception erhalte ich auch wenn ich mein array von 16 (playersText[16]) mit 16 spielern voll ausgefüllt ist..

ich kann mein array nicht geten und seten...da der compiler es mir rot anpinselt 🙁

Java:
playersName[i].setText(playersText[i]);
 
das thema mit der liste hab ich noch nicht ganz verstanden..da wüsste ich kein lösungsansatz..hab das mal in c# gemacht mit listen..aber das ist auch schon sehr sehr lange her weiss also gar nichts mehr darüber -.-
Entweder dann eben einlesen oder mal vorerst lassen und mit arrays realisieren.

und die nullpointer exception erhalte ich auch wenn ich mein array von 16 (playersText[16]) mit 16 spielern voll ausgefüllt ist..
Dann musst du dir die Exception + StackTrace genau anschauen. Der StackTrace verrät dir genau bei welcher Zeile der Fehler passiert. Dort greifst du auf ein nicht vorhandenes Objekt zu.
(Meine Vermutung war nur das es diese Schleife war)

ich kann mein array nicht geten und seten...da der compiler es mir rot anpinselt 🙁
Java:
playersName[i].setText(playersText[i]);
Ist ja auch logisch. Die Methode "setText" erwartet einen String als Parameter. Im Array playersText befinden sich aber JTextfields und keine Strings.
Aber du kannst vom JTextfield die getText() Methode aufrufen um an den Text zu kommen (dieser ist dann ein String).
 
ja das ist ja alles soweit ganz klar..aber ich kann ja nicht den inhalt des arrays alles in einer schleife in strings umzuwandeln um damit besser arbeiten zu können oder doch..meine versuche damit schlugen leider fehl
 
..aber ich kann ja nicht den inhalt des arrays alles in einer schleife in strings umzuwandeln um damit besser arbeiten zu können oder doch ...
Mir ist leider nicht ganz klar was du uns damit sagen willst 😉

Der Inhalt des Arrays sind x Textfields. Im Post#1 hast du geschrieben, du willst an diese Wert rankommen -> sprich die Spielernamen welche du in die Textfields geschrieben hast auswerten und damit arbeiten oder?
Und mittels der getText() Methode von JTextfield kommst du an diese Werte ran.

Du wandelst in der Schleife nichts um sondern holst dir von einem Objekt einen Wert raus. Was du mit diesem Wert dann machst bleibt dir überlassen.
 
ok habs jetzt so gemacht...

Klasse Player:
Java:
package s;
public class Player{
  String name   = "";
  int    teamId = 0;

  public Player( String name ){this.name = name;}

  public void setTeamId( int teamId )
  {this.teamId = teamId;}

  public int getTeamId()
  {return teamId;}

  public String getName()
  {return name;}

  @Override
  public String toString()
  {return getName();}
}

und das hauptprogramm in der actionperformed hab ich meine buttons in einem switch case die dann die unterschiedlichen dinge auslösen (db tabellen anlegen falls nicht vorhanden im sqlite und so weiter..das funktioniert auch..muss nur hinbekommen das ich jetzt endlcih mit den namen arbeiten kann :/

Java:
/*#### VARETC #################################*/
public class TourMain extends JFrame implements ActionListener, ComponentListener
{
//...
  private JTextField[] playersText  = new JTextField[16];
  private JLabel[]     playersLabel = new JLabel[16];
//...
  ArrayList<Team>      alTeams      = new ArrayList<Team>( 16 );
  ArrayList<Player>    alPlayer     = new ArrayList<Player>( 16 );

  /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  /*#### FRAME # BUTTONS SETTINGS ##################*/
//...
  /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  /*#### LISTENER ###############################*/
  @Override
  public void actionPerformed( ActionEvent e )
  {
    //    String resultStr;
    String str = String.valueOf( e.getActionCommand() );
    String player = displayText.getText();
    String team = displayText2.getText();
    int p = Integer.parseInt( player );
    switch( str )
    //switch case for better overview all buttons
    {
      case "Ready":
        int x = 10,x2 = 75,y = 10;//start position labels and textfields
//...
        for( int i = 0; i < p; i++ )
        {
          playersLabel[i] = new JLabel();
          playersLabel[i].setText( "Player " + i + ":" );
          playersLabel[i].setBounds( x, y, 135, 17 );
          this.add( playersLabel[i] );

          playersText[i] = new JTextField( "PlayerId: " + i );
          playersText[i].setBounds( x2, y, 135, 17 );
          playersText[i].addActionListener( this );
          this.add( playersText[i] );

          y += 20;
        }
        break;

   
case "Start Game":
        //        for( Player pl : alPlayer )
        //        {
        //          String name = p.getName();
        //
        //        }

        for( int i = 0; i <= p; i++ )
        {
          //playersText[i].getText();
          Player pl = new Player( playersText[i].getText() );
          alPlayer.add( pl );
        }

        //        for( int i = 0; i < alPlayer.size(); i++ )
        //        {
        //          alPlayer.get( i ).setTeamId = 3;
        //        }
        button[2].setVisible( true );
        button[1].setVisible( false );
        count++;
        System.out.println( alPlayer.get( 0 ) );
        break;
//...
  }
  /*#### MAIN ###################################*/
  public static void main( String[] args )
  {
    TourMain C = new TourMain();
  }
  /*^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^*/
  //...
}

und bekomm nur wieder null-pointer exceptions...grrr ich wenn ich mal richtig debuggen könnte (wie in vs)
also es muss ja irgendwo an dieser forschleife liegen
Java:
case "Start Game":
for( int i = 0; i <= p; i++ )
        {
          //playersText[i].getText();
          Player pl = new Player( playersText[i].getText() );
          alPlayer.add( pl );
        }
        System.out.println( alPlayer.get( 0 ) );
weil sofern die schleife durchlaufen wurde bricht das programm ab und ist nicht mehr steuerbar -.-

wenn ich in der schleife den syso schreib..bekomm ich halt anzahl schleifendurchgänge meinen index 0 ausgegeben..dannach passiert nichts mehr..also von den buttons her
 
Zuletzt bearbeitet:
ok fehler...war mein = schon behoben...^^

Hallo annalena,

ich habe das selbe Problem. Ich erstelle ein paar JTextFields[ i ] mit Text Bsp. ("Text " + i) über eine Schleife. Das klappt auch alles. Ich weiß nur nicht, wie ich die Textboxen wieder ansprechen kann, also z.B. den Inhalt der Textboxen wieder auslesen kann... 🙁
Kannst Du beschreiben (Code) wie Du das Problem gelöst hast?

Bsp.:

Ich will mit der private void read() den Inhalt des 3. Textfeldes auslesen...

Code:
import java.awt.EventQueue;
import javax.swing.JFrame;
import javax.swing.JOptionPane;
import javax.swing.JTextField;
import javax.swing.text.JTextComponent;
import javax.swing.JButton;
import java.awt.event.ActionListener;
import java.util.ArrayList;
import java.util.List;
import java.awt.event.ActionEvent;

public class Test {

    private JFrame frame;
    private JTextField[] txtfarr;

    public static void main(String[] args) {
        EventQueue.invokeLater(new Runnable() {
            public void run() {
                try {
                    Test window = new Test();
                    window.frame.setVisible(true);
                } catch (Exception e) {e.printStackTrace();}}
        });
    }

    public Test() {
        initialize();}

    private void initialize() {
        frame = new JFrame();
        frame.setBounds(100, 100, 450, 300);
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        frame.getContentPane().setLayout(null);
    
   
//        Hier werden die Textboxen über das Array erstellt
        int i=0;
        int ypos=10;
        int add=25;
        for(i=0;i<5;i++) {
            JTextField[] txtfarr = new JTextField[5];
            txtfarr[i] = new JTextField();
            txtfarr[i].setBounds(100, ypos + i*add, 50, 20);
            txtfarr[i].setText("Hallo " + (i+1));
            frame.getContentPane().add(txtfarr[i]);
    }
   
   
        JButton btnNewButton = new JButton("TextBox 2 Auslesen");
            btnNewButton.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent arg0) {
                    read();}
            });
        btnNewButton.setBounds(10, 227, 175, 23);
        frame.getContentPane().add(btnNewButton);
    }

    private void read() {
        try {
//            Hier bekomme ich die Fehlermeldung NullPointerException
            String content = txtfarr[2].getText();
            JOptionPane.showMessageDialog(null, content);
        } catch (Exception e) {JOptionPane.showMessageDialog(null, e);}
    }
}

Danke und Grüße Esche
 
Zuletzt bearbeitet:
Moin,

(a) schau mal auf das Datum des letzten Posts !! 😉

(b) Du bekommst die NPE, da Dein Array 'txtfarr' an der gekennzeichneten Stelle nicht bekannt ist!
Es existiert nur lokal innerhalb Deiner for-Schleife !!
Java:
for(i=0;i<5;i++)
{
    JTextField[] txtfarr = new JTextField[5];
    // ...
}

VG Klaus
 
Du bekommst die NPE, da Dein Array 'txtfarr' an der gekennzeichneten Stelle nicht bekannt ist!
Bekannt ist es schon sonst würde es ja nicht kompilieren. Aber du erzeugst in der Schleife jedes mal noch ein weiteres Array mit gleichem Namen. Aber dasjenige welches du eigentlich meinst bleibt leer.

Probier es doch mal so:
Code:
//        Hier werden die Textboxen über das Array erstellt
        int i=0;
        int ypos=10;
        int add=25;
        txtfarr = new JTextField[5];
        for(i=0;i<5;i++) {
            txtfarr[i] = new JTextField();
            txtfarr[i].setBounds(100, ypos + i*add, 50, 20);
            txtfarr[i].setText("Hallo " + (i+1));
            frame.getContentPane().add(txtfarr[i]);
    }
 
Hallo!

Vielen Dank für Eure Antworten!!!

@VfL_Freak ich weiß, dass der letzte Post schon länger her ist 😉... Ich war trotzdem noch das letzte Stückchen von der Lösung entfernt und dankbar, dass meine Frage überhaupt noch gelesen wurde...

@JStein52, dass war genau der richtige Tip!! Und es ist auch logisch, bin nur nicht drauf gekommen an dieser Stelle nach dem Fehler zu suchen!!!!
1000 Dank!! 🙂🙂🙂
 
Ich habenoch eine Frage:
Kann man zu dem Array auf irgend eine Art einen Listener hinzufügen?

Java:
//        Hier werden die Textboxen über das Array erstellt
        int i=0;
        int ypos=10;
        int add=25;
        txtfarr = new JTextField[5];
                txtfarr.addFocusListener(new FocusAdapter() {
                    @Override
                    public void focusLost(FocusEvent arg0) {
                        JOptionPane.showMessageDialog(null, "Du bist Raus aus txtfarr + i");}
                });
        for(i=0;i<5;i++) {
            txtfarr[i] = new JTextField();
            txtfarr[i].setBounds(150, ypos + i*add, 50, 20);
            txtfarr[i].setText("Hallo " + (i+1));
            frame.getContentPane().add(txtfarr[i]);
    }

Das hier funktioniert nicht...
Wenn ich z.B. eine Textbox aus dem array verlasse, soll die Meldung kommen, welche Textbox ich verlassen habe...
 
Du musst den einzelnen Textfeldern einen Listener hinzufügen, nicht dem Array in dem du die Referenzen speicherst.

Edit: zu spät 🙂🙂
 
Ok,

soweit spricht der AL schon mal an, aber der Zähler i wird im AL nicht akzeptiert... Und ich bekomme immer den showMessageDialog 2 mal ...
Woher weiß ich aus welchem JTextFiled ich raus bin?? 🙄

Java:
//        Hier werden die Textboxen über das Array erstellt
        int i=0;
        int ypos=10;
        int add=25;
        txtfarr = new JTextField[5];
        for(i=0;i<5;i++) {
            txtfarr[i] = new JTextField();
          
            txtfarr[i].addFocusListener(new FocusAdapter() {
                            @Override
                            public void focusLost(FocusEvent arg0) {
                                JOptionPane.showMessageDialog(null, "Du bist Raus aus txtfarr");}
                        });
          
            txtfarr[i].setBounds(150, ypos + i*add, 50, 20);
            txtfarr[i].setText("Hallo " + (i+1));
            frame.getContentPane().add(txtfarr[i]);
        }
 
Gib deinen Textfeldern einen eindeutigen Namen z.B. setName(""+i); die Nummer des Feldes in dem Array. Diesen Namen kannst du dann im AL abfragen, nach int umwandeln und dann hast du den Index des Textfeldes im Array
 
Hallo JStein52,

die Idee verstehe ich. Ich habe allerdings das Problem mit der Syntax im AL, da der Zähler des Arrays einen Fehler liefert, den ich nicht verstehe... (Local variable i defined in an enclosing scope must be final or effectively final)...
Eine Idee?

Java:
//        Hier werden die Textboxen über das Array erstellt
        int i=0;
        int ypos=10;
        int add=25;
        txtfarr = new JTextField[5];
        for(i=0;i<5;i++) {
            txtfarr[i] = new JTextField();
           
             txtfarr[i].addFocusListener(new FocusAdapter() {
                            @Override
                              public void focusLost(FocusEvent arg0) {

// Abfrage des Namen des JTF. Hier kommt die Fehlermeldung
                                String x=txtfarr[i].getName();

                                JOptionPane.showMessageDialog(null, "Du bist Raus aus txtfarr " + x);}
                        });
           
            txtfarr[i].setBounds(150, ypos + i*add, 50, 20);
            txtfarr[i].setText("Hallo " + (i+1));
// Namen des JTextFields setzen           
            txtfarr[i].setName(""+(i+1));
            frame.getContentPane().add(txtfarr[i]);
        }
 
die Idee verstehe ich. Ich habe allerdings das Problem mit der Syntax im AL, da der Zähler des Arrays einen Fehler liefert, den ich nicht verstehe... (Local variable i defined in an enclosing scope must be final or effectively final)...
Eine Idee?

Das Problem hier ist, dass Du innerhalb der Schleife anonyme Focus Listener Funktionen erzeugst, das Event tritt aber Zeitlich nicht zur gleichen Zeit ein. Wodurch Dein i in allen aufrufen den gleichen, also den Endwert hätte. Mit final Variablen funktioniert das, da sie sich nicht mehr verändern.

Du muss wie @truesoul schon geschrieben hat, über die Übergabeparameter gehen.
 
Code:
                            @Override
                              public void focusLost(FocusEvent arg0) {
                               Component comp = arg0.getComponent();
                               int index = Integer.parseInt(comp.getName());
                                JOptionPane.showMessageDialog(null, "Du bist Raus aus txtfarr " + index);}
                        });
So sollte es gehen.
 
Komischerweise bekomme ich aber wenn ich von JTextFeld[1] in JTextFeld[2] wechsle, "Du bist Raus aus txtfarr 1" UND "Du bist Raus aus txtfarr 2" 🙁.
Es ist doch aber ein focusLost-Listener und kein focusGained?
Übersehe ich da was?
 

Zurück
Oben