TextField Nullpointer Exc

malufi89

Mitglied
Hallo zusammen.

Ich habe eine "Maske" erstellt, die ein Panel (heißt bei mir Knoten) hinzufügt (oder entfernt), wenn man auf den entsprechenden Button klickt.
Dieses Panel besteht aus einer Nummer (wird automatisch hoch bzw runtergezählt), einer Combobox, und zwei TextFields.

die Combobox funktioniert super mit dem ActionListener. Aber jedes Mal wenn ich in einem der beiden Textfields eine Eingabe mache und Enter drücke, kommt eine Nullpointer exception. (Sobald ich das Textfield mit XY.getText(); anspreche)

Frage1: Woran liegts und wie kann ichs lösen?
Frage 2: Angenommen ich habe mehrere Panels (mit also mehr als 2 Textfields und Comboboxen) erzeugt (diese werden in einem Array gespeichert), (wie) kann ich dann für jedes Panel "manuell" die Action Events auslösen? Dies sollte passieren, wenn ich einen weiteren Button drücke.

Hier ein paar Codeschnipsel die es denk ich brauch um das Problem zu lösen:


private JTextField name;
private JTextField links;
private final int mynumber;
public static ArrayList<String> formen= new ArrayList(100);
public static ArrayList<String> namen= new ArrayList();
public static ArrayList<String> verbindungen= new ArrayList(100);

!!Hinweis: Vorsicht! Ich habe also ein Array das nameN heißt und ein Textfield das name heißt...

Definieren der Boxen etc


Java:
        mynumber=getCounter();
        JComboBox Knotenform = new JComboBox(KnotenForm);
        Knotenform.setSelectedIndex(0);
        Knotenform.addActionListener(this);
        Knotenform.setActionCommand("Knotenform");
        
        JTextField name= new JTextField(10);
        name.setText("Enter Name");
        name.addActionListener(this);
        name.setActionCommand("Name");
        
        
        JTextField links= new JTextField(20);
        links.setText("Enter Linking-Number");
        links.addActionListener(this);
        links.setActionCommand("Verbindung");

        formen.add(mynumber, "none");
        namen.add(mynumber, "none");
        verbindungen.add(mynumber, "");
Java:
@Override
	public void actionPerformed(ActionEvent e) {
			if (e.getActionCommand().equals("Knotenform")){
			JComboBox cb = (JComboBox)e.getSource();
	        String Knotenform = (String)cb.getSelectedItem();
	        
	        if (Knotenform.equals("--Please Choose Knode Format--")){
	        	System.out.println("Nothing chosen");
	        	formen.add(mynumber, "none");
	        	}
	        if (Knotenform.equals("rectangular")){
	        	//System.out.println("rectangular");
	        	formen.add(mynumber, "rectangular");
	        	System.out.println(mynumber + formen.get(mynumber));
	        }
	        if (Knotenform.equals("round")){
	        	//System.out.println("round");
	        	formen.add(mynumber, "round");
	        	System.out.println(mynumber + formen.get(mynumber));
	        }
		}
	
		if (e.getActionCommand().equals("Name")){
			String bla= name.getText();
			namen.add(mynumber, bla);
			System.out.println(mynumber + namen.get(mynumber));
			
		}
		
		if (e.getActionCommand().equals("Verbindung")){
			System.out.println(links.getText());
		    verbindungen.add(mynumber, links.getText());
		}
	}

ich hoffe das Reicht um meine Frage zu beantworten :/
 
Zuletzt bearbeitet von einem Moderator:
sollen das die instanzvariablen sein ? ala private JTextField name ?

weil du im code JTextField name= new JTextField(10); stehen hast, was eine lokale variable ist und nix mit der instanzvariable zu tun hat

ergo: name= new JTextField(10);
 
Weil deine Instanzvariablen auch null sind. Es sollte so aussehen:
Java:
class Test {
  private JTextField name;
  private void init() {
    name = new JTextField();
    //und NICHT:
    //JTextField name = new JTextField();
  }
}

Du kannst das, was im ActionListener passieren soll auslagern und dann einfach die Methode auch manuell aufrufen. Grob:
Java:
...
public void actionPerformed(ActionEvent e) {
  doSmth();
}
private void doSmth() {
  ....
}
...
 
entschuldigt für den doppelpost, es war ja fast zu banal:
Java:
JTextField tf=(JTextField)e.getSource();
			String bla= tf.getText();
so kriege ich den Text...
ah und danke für eure Antworten!

nun also noch die Frage: (Wie) kann ich denn Actions auf einmal abfeuern?

EDIT: Danke vielmals... da hatte ichs mal wieder mit den Variablen. Habe meinen Fehler verstanden. Echt doof.
 
Zuletzt bearbeitet:
stecke deinen Action-Code in normale Methoden, Methoden kannst du genau dann aufrufen wenn du willst,
nicht nur aus dem zugehörigen Listener aus, sondern auch von jeder anderen Codestelle

bzw. steht bei XHelp auch schon
 
nur wie spreche ich dabei die einzelnen Knoten(Panels) an?

Kann ich dann einfach mein array ansprechen und sagen
Java:
int i=0;

while (i<Knoten.getKnoten.size()){  
  Knoten k=Knoten.getKnoten().get(i);
  String first=k.name.getText();
  i++;
}
(Knoten.getKnoten() ist also der getter für das Array wo alle Knoten drin sind)
 
grundsätzlich geht fast alles, also auch dazu erstmal ja,
wobei es auch schönere Schleifen gibt..
 
ich habs grade probiert und juhu es funktioniert.

ein schöner programmierstil gehört zu dem luxus den ich mir einfach nicht leisten kann 😳 ich bin froh wenn ich halbwegs das hinbekomme, was ich möchte
 
ein schöner programmierstil gehört zu dem luxus den ich mir einfach nicht leisten kann ich bin froh wenn ich halbwegs das hinbekomme, was ich möchte
Das denkst Du ca. ein halbes Jahr (je nachdem wie lange Du brauchst, um die Syntax von Java zu beherrschen). Danach wirst Du feststellen, dass Du ohne guten Stil nie in der Lage sein wirst, zeitnah, performant und zuverlässig komplexere Probleme zu lösen.
 

Neue Themen


Zurück
Oben