Textfelder sind gleich null

AmsananKING

Mitglied
Ich arbeite schon seit längerem an einem Bluej Projekt. In diesem Projekt habe ich die Klasse Anmeldung eingebaut, doch leider kann ich aus den Textfeldern auf Knopfdruck keine Daten abfragen.
Könnte mir jemand bitte helfen?
Mit freundlichen Grüßen Amsanan
[CODE lang="java" title="Gui.class"]
/**
* Beschreiben Sie hier die Klasse Gui.
*
* @author (Ihr Name)
* @version (eine Versionsnummer oder ein Datum)
*/
import javax.swing.*;
import java.awt.event.*;
import java.awt.*;
import java.net.URL;
public class Gui extends JFrame implements ActionListener
{ Var var =new Var();
static CardLayout cl=new CardLayout();
Menue menue =new Menue();
Anmeldung anmeld=new Anmeldung();
static JPanel rootPanel=new JPanel();
JButton Play =new JButton();
JButton Options =new JButton();
JButton Exit =new JButton();

public Gui(){
setTitle("Pong");
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
setSize(var.getWidth(),var.getHeight());
setLocationRelativeTo(null);
add(rootPanel());
setVisible(true);
}

public JPanel rootPanel(){
rootPanel.setPreferredSize(new Dimension(var.getWidth(),
var.getHeight()));
rootPanel.setLayout(cl);
rootPanel.add(menue,"menue");
rootPanel.add(anmeld,"anmeldung");
cl.show(rootPanel,"menue");
return rootPanel;
}

public void actionPerformed(ActionEvent e){
if(e.getSource().toString().contains("Play"))
{System.out.println("Play");
cl.show(rootPanel,"anmeldung");
}
if(e.getSource().toString().contains("Exit"))
{System.out.println("Exit");
System.exit(0);}
if(e.getSource().toString().contains("Options"))
{System.out.println("Options");
}

}

public static void change(JPanel pPanel,String pName){
rootPanel.add(pPanel,pName);
cl.show(rootPanel,pName);
}
private class Menue extends JPanel{

public Menue(){
setSize(var.getWidth(),var.getHeight());
setLayout(null);
setBackground(Color.BLACK);
for(JButton b:buttons()){
add(b);

}
add(titel());
}

public JButton button(String pText,int pX,int pY){
JButton temp =new JButton();
temp.setText(pText);
temp.setBounds(pX,pY,150,40);
Font font =new Font("Tahoma",Font.PLAIN,24);
temp.setFont(font);
return temp;
}

public JButton[] buttons(){
JButton[] buttons;
Play=button("Play",300,200);
Options=button("Options",300,300);
Exit=button("Exit",300,400);
buttons=new JButton[]{Play,Options,Exit};

for(JButton j:buttons){
j.addActionListener(Gui.this);
}
return buttons;
}

private JLabel titel(){
JLabel titel =new JLabel();
URL url =this.getClass().getResource("titel.gif");
ImageIcon icon =new ImageIcon(url);
titel.setIcon(icon);
titel.setBounds(200,10,300,100);
return titel;
}
}
}
[/CODE]
[CODE lang="java" title="Anmeldung.class" highlight="148-153,119-129"]import javax.swing.*;
import java.awt.event.*;
import java.awt.*;

public class Anmeldung extends JPanel implements ActionListener
{ private static String[] names={"Anmeldung","Anrede","Player1","Player2","Vorname","Nachname","Gamenr"};
private static String[] anred={"m","w","d"};
static JLabel temp2;
Var var=new Var();
private Gui gui;
static GamePanel gpanel =new GamePanel();
List<Players> Playerlist =new List<Players>();
public Anmeldung(){
setLayout(null);
setSize(var.getWidth(),var.getHeight());
setBackground(Color.BLACK);
test();
}

public JLabel[] labels(){
JLabel[] labels=new JLabel[names.length];

for(int i=0;i<names.length;i++){
if(names!="Submit"){
labels=new JLabel(names);
}

}

return labels;

}

public JLabel[] labels2(){
JLabel[] labels2=new JLabel[labels().length];
for (int i=0;i<labels().length;i++){
if(labels().getText()=="Anmeldung"){
labels2=labelsset(labels().getText(),300,10,200,30);
}
if(labels().getText().contains("Player")){
if(labels().getText().contains("1")){
labels2=labelsset(labels().getText(),100,150,100,20);

}
if(labels().getText().contains("2")){
labels2=labelsset(labels().getText(),100,190,100,20);

}
}
if(labels().getText().contains("name")){
if(labels().getText().contains("Vor")){
labels2=labelsset(labels().getText(),300,100,100,20);

}
if(labels().getText().contains("Nach")){
labels2=labelsset(labels().getText(),400,100,200,20);

}
}
if(labels().getText().contains("Anrede")){
labels2=labelsset(labels().getText(),200,100,100,20);
}
}
return labels2;
}

private JLabel labelsset(String pText,int pX,int pY,int pWidth,int pGr){
JLabel temp =new JLabel(pText,JLabel.CENTER);
temp.setBounds(pX,pY,pWidth, pGr+10);
Font font=new Font("Tahoma",Font.PLAIN,pGr);

temp.setFont(font);
temp.setBorder(BorderFactory.createLineBorder(Color.black));
temp.setForeground(Color.WHITE);
return temp;
}

public JComboBox[] cbox(){
int x=225;
JComboBox[] cbox=new JComboBox[2];
cbox[0]=combobox("Player1",x,150,50,20,anred);
cbox[1]=combobox("Player2",x,190,50,20,anred);

return cbox;
}

public void test(){
for(int i=0;i<labels2().length;i++)
if(labels2()!=null){
add(labels2());
}
for(int i=0;i<cbox().length;i++){
add(cbox());
}
for(int i=0;i<textfields().length;i++){
add(textfields());
}
add(button());
}

private JComboBox combobox(String pName,int pX,int pY,int pWidth,int pGr,String [] pRay){
JComboBox cbox=new JComboBox(pRay);
cbox.setName(pName);
cbox.setBounds(pX,pY,pWidth,pGr+10);
Font font =new Font("Tahoma",Font.PLAIN,pGr);
cbox.setFont(font);
return cbox;
}

private JTextField tfield(String pName,int pX,int pY,int pWidth,int pGr){
JTextField field =new JTextField();
field.setName(pName);
field.setBounds(pX,pY,pWidth,pGr+10);
Font font =new Font("Tahoma",Font.PLAIN,pGr);
field.setFont(font);
return field;
}

public JTextField[] textfields(){
JTextField[] textfields=new JTextField[4];

int g=15;
JTextField vorname1=tfield("PlayerV1",300,150,100,g);
JTextField nachname1=tfield("PlayerN1",425,150,200,g);
JTextField vorname2=tfield("PlayerV2",300,190,100,g);
JTextField nachname2=tfield("PlayerN2",425,190,200,g);
textfields=new JTextField[]{vorname1,nachname1,vorname2,nachname2};
return textfields;
}

public JButton button(){
JButton button =new JButton("Submit");

Font font =new Font("Tahoma",Font.PLAIN,25);
button.setFont(font);
button.setBounds(300,500,200,30);
button.addActionListener(this);

return button;
}

public void anmeldung(){
int rand =(int) (Math.random()*10);
String var =textfields()[0].getText();
System.out.println(var);
}

public void actionPerformed(ActionEvent e){
if(e.getSource().toString().contains("Submit")){
anmeldung();
//Gui.change(gpanel,"gpanel");
}
}
}
[/CODE]
 
dein Code ist SEHR schwer zu lesen labels ist mal ne methode dann ist labels ein array... labels2 dann labelsset ...

kannst du bitte den Zeitpunkt angeben ab wann was schief läuft
und dann out.println was schief gelaufen ist

bzw deine methoden und variablen eindeutig benennen



methoden Namen sollten ungefähr aussagen was passiert ; spezielle sachen wie " übergabe darf nicht null sein " kann man als kommentar dann drüber schreiben oder sonst was.. aber labels() + labels + labels2 ist einfach irgendwas
 
Zuletzt bearbeitet von einem Moderator:
Die Methode textfields() erzeugt immer neue Textfelder und packt diese in ein Array um diese zurück zu geben.

Jetzt fängt es schon hier an:
In der Methode test (Was für ein Name! Was testet test denn? Da wird die Oberfläche aufgebaut aber nichts getestet) hast du u.a.:
Java:
        for(int i=0;i<textfields().length;i++){
            add(textfields()[i]);
        }

Hier wird jetzt mehrfach textfields() aufgerufen, jedes Mal werden die Textfelder erzeugt, die Du brauchst aber es wird nur ein Textfeld hinzu gefügt.
Das ist also wie:
Ich: Gib mir die Bücher: buch1, buch2, buch3, buch4
Du: Ab ins Geschäft, die 4 Bücher gekauft und mir gegeben.
Ich: buch1 nutze ich (lege es auf den Tisch) und den rest werfe ich in den Müll.
Ich: Gib mir die Bücher: buch1, buch2, buch3, buch4
Du: Ab ins Geschäft, die 4 Bücher gekauft und mir gegeben.
Ich: buch2 nutze ich (lege es auf den Tisch) und den rest werfe ich in den Müll.
...

Also wenig sinnvoll. Textfelder einmal holen und dann alle nutzen.


Das wiederholt sich dann in anmeldung:
Java:
String var =textfields()[0].getText();

Also um beim Beispiel mit den Büchern zu bleiben:
Ich: Gib mir die Bücher: buch1, buch2, buch3, buch4
Du: Ab ins Geschäft, die 4 Bücher gekauft und mir gegeben.
Ich: WTF: In das Buch1 auf dem Tisch habe ich etwas geschrieben - warum steht das nicht in dem Buch?

Also: Speichere die Controls, die Du erstellt hast. Erstelle nicht ständig neue Instanzen sondern nutze die, die Du einmal erstellt hast.

Java:
        JTextField vorname1=tfield("PlayerV1",300,150,100,g);
        JTextField nachname1=tfield("PlayerN1",425,150,200,g);
        JTextField vorname2=tfield("PlayerV2",300,190,100,g);
        JTextField nachname2=tfield("PlayerN2",425,190,200,g);
Das könnte z.B. als Instanzvariablen in der Klasse stehen. Dann entfällt die Methode textfields und du musst nur noch ein add für jede dieser Variablen machen. Und dann kannst Du diese Variablen auch in dem Event Listener verwenden.

Und evtl. schaust Du mal nach Tutorials, die nicht diese dubiose Klasse Var nutzen. Die (und auch andere Tutorials, die vieles static machen wollen) gehören nur an einen Ort: Die Tonne. Daran ändern auch gute Bewertungen nichts fürchte ich. Das aber nur am Rande als dezenter Hinweis.
 

Neue Themen


Zurück
Oben