JTextField nach Button-Klick auslesen

tobitobsen82

Grünschnabel
Tach Leude,

komme irgendwie nich so ganz klar.

Mein Programm besteht bislang aus 3 Klassen:
FensterElemente mit Methoden zum Erstellen von JComponents
Fenster mit Konstruktoren und darin der geaddeten Components und der Main-Methode
Menu zum Erzeugen des JMenus

In der Klasse Fenster soll nun aus einem JTextField (nameField) ein Text nach Klicken auf den OK-Button auf der Konsole ausgegeben werden.

Bekomme von Eclipse keine Fehlermeldung angezeigt. Wenn ich das Programm ausführe kommt allerdings eine NullPointerException, die sich auf eine Zeile in meinem ActionPerformed bezieht, in der mit getText() das TextField ausgelesen werden soll.

Ich hoffe Ihr könnt mir helfen.

Hier nun mein bisheriger Stand.

FensterElemente:

Code:
package listener;

import javax.swing.*;

class FensterElemente extends JFrame{
	
	/**
	 * Dateiname: FensterElemente.java
	 * Compiler: Eclipse SDK 3.2.1
	 * Autor: Tobias Fickinger
	 * Erstellungsdatum: 17.04.07
	 * Letzte Änderung: 23.04.07
	 * Beschreibung des Moduls: Klasse mit Methoden zum Erstellen von Fensterkomponenten für ein GUI
	 * Paket: fenster (zusammen mit: Fenster.java)
	 */	
	
	public JTextField createTextField(int size){
		/*
		 * Methodenname: createTextField
		 * Parameter: integer size (Festlegung der Länge des Textfields)
		 * Return-Wert: panel auf das ein JTextField gelegt wurde
		 * Beschreibung: Erzeugen eines leeren Textfeldes auf einem neuen Panel
		 */
		JTextField elem = new JTextField("", size);
		return elem;
	}

	public JComponent createTextArea(int spalten, int zeilen){
		/*
		 * Methodenname: createTextArea
		 * Parameter: integer spalten (Festlegung der Spalten), integer zeilen (Festlegung der Zeilen der Textarea)
		 * Return-Wert: panel auf das eine JTextArea gelegt wurde
		 * Beschreibung: Erzeugen einer Textarea mit vorbestimmtem Inhalt und Scrollbalken auf einem neuen Panel
		 */
		JTextArea elem = new JTextArea(spalten, zeilen);
		elem.append("Dieses hier ist eine Textarea. Hier lässt sich\n" +
					"viel Kommentar einfügen\n" +
					"\n" +
					"");
		JPanel panel = new JPanel();
		panel.add(new JScrollPane(elem));
		return panel;
	}

	public JComponent createButton(String title){
		/*
		 * Methodenname: createButton
		 * Parameter: String title (Festlegung des Textes auf dem Button)
		 * Return-Wert: panel auf das ein JButton gelegt wurde
		 * Beschreibung: Erzeugen eines JButtons auf einem neuen Panel
		 */
        JButton elem = new JButton(title);
		return elem;
	}

	public JComponent createRadioButtons(String[] title, boolean[] active)
	{
		/*
		 * Methodenname: createRadioButtons
		 * Parameter: String title1 (Titel des 1. RadioButton), boolean tb1 (Aktivierungsstatus des 1. Button), 
		 * 			  String title2 (Titel des 2. RadioButton), boolean tb2 (Aktivierungsstatus des 2. Button)
		 * Return-Wert: panel auf das mehrere JRadioButton gelegt werden
		 * Beschreibung: Erzeugen einer Buttongroup inkl. Beschriftung und Aktivierungswert auf einem neuen Panel
		 */
		JRadioButton[] rb = new JRadioButton[title.length];
	      ButtonGroup group = new ButtonGroup();
			Box box = new Box(BoxLayout.Y_AXIS);
	      
		for(int i = 0 ; i < title.length ; i++){
			rb[i] = new JRadioButton(title[i], active[i]);
			group.add(rb[i]);
			box.add(rb[i]);
		}
		return box;
	}

	public JComponent createCheckBox(String[] title, boolean[] active)
	{
		/*
		 * Methodenname: createCheckBox
		 * Parameter: String title1 (Titel der 1. CheckBox), boolean tb1 (Aktivierungsstatus der 1. CheckBox), 
		 * 			  String title2 (Titel der 2. CheckBox), boolean tb2 (Aktivierungsstatus der 2. CheckBox)
		 * Return-Wert: panel auf das mehrere JCheckBox gelegt werden
		 * Beschreibung: Erzeugen mehrerer Checkboxen inkl. Beschriftung und Aktivierungswert auf einem neuen Panel
		 */
		JCheckBox[] cb = new JCheckBox[title.length];
		Box box = new Box(BoxLayout.Y_AXIS);
	      
		for(int i = 0 ; i < title.length ; i++){
			cb[i] = new JCheckBox(title[i], active[i]);
			box.add(cb[i]);
		}		
		return box;
	}

	public JComponent createComboBox(String[] title){
		/*
		 * Methodenname: createComboBox
		 * Parameter: String title1 (Titel der 1. Zeile der ComboBox), String title2 (Titel der 2. Zeile der ComboBox), 
		 * 		      String title3 (Titel der 3. Zeile der ComboBox)
		 * Return-Wert: panel auf das eine JComboBox gelegt wurde
		 * Beschreibung: Erzeugen einer DropDownBox auf einem neuen Panel mit Parameterübergabe der Inhalte
		 */
        JComboBox elem = new JComboBox(title);
		JPanel panel = new JPanel();
        panel.add(elem);
		return panel;
	}
	
	public JComponent createJLabel(String title){
		/*
		 * Methodenname: createJLabel
		 * Parameter: String title (Festlegung des Titels des JLabels)
		 * Return-Wert: panel auf das ein JLabel gelegt wurde
		 * Beschreibung: Erzeugen eines JLabels mit per Parameter übergebenem Inhalt auf einem neuen Panel
		 */		
		JLabel label = new JLabel(title);
		JPanel panel = new JPanel();
		panel.add(label);
		return panel;
	}	
	
	public JComponent createEmptyJLabel(int anzahl)
	{
		/*
		 * Methodenname: createEmptyJLabel
		 * Parameter: integer anzahl (Festlegung der Anzahl an Leerzeichen zur "Verlängerung" des leeren JLabels
		 * Return-Wert: panel auf das ein leeres JLabel gelegt wurde
		 * Beschreibung: Erzeugen eines leeren JLabels mit per Parameter übergebener Anzahl an Leerzeichen auf einem neuen Panel
		 */			
		String leerzeichen = "";
		for(int i = 0 ; i < anzahl ; i++){
			leerzeichen = leerzeichen + (" ");
		}
		JLabel label = new JLabel(leerzeichen);
		JPanel panel = new JPanel();
		panel.add(label);
		return panel;
	}	
}

Und hier Fenster.java:

Code:
package listener;

import java.awt.*;
import java.awt.event.*;

import javax.swing.*;
import javax.swing.plaf.basic.BasicOptionPaneUI.ButtonActionListener;
import javax.swing.text.JTextComponent;

public class Fenster{

	/**
	 * Dateiname: Fenster.java
	 * Compiler: Eclipse SDK 3.2.1
	 * Autor: Tobias Fickinger
	 * Erstellungsdatum: 17.04.07
	 * Letzte Änderung: 23.04.07
	 * Beschreibung des Moduls: Hauptprogramm zur Anzeige eines simplen Fensters ohne Ereignisse. Methoden werden größtenteils aus der Klasse FensterElemente bezogen
	 * Paket: fenster (zusammen mit: FensterElemente.java)
	 */
	public static void main(String[] args) {
		// Instanzierung des Fensterobjekts
		ReservierungsFenster fensterobjekt = new ReservierungsFenster();
		// Sichtbarkeit festlegen
		Menu menu = new Menu();
		fensterobjekt.setJMenuBar(menu.setMenuBar());
		fensterobjekt.setVisible(true);
	}	
}

class ReservierungsFenster extends JFrame{
	private static final long serialVersionUID = 1L;
	String contentNameField;
	public JTextField nameField;
	
	// Konstruktoren
	
	public ReservierungsFenster(){
		// Konstruktoraufruf mit Parameter für Titelname des Fensters
		this("Platzreservierung");
	}
	
	public ReservierungsFenster( String titel ){
		super(titel);
		setSize(420,400);
		
		//Elemente holen
		FensterElemente element = new FensterElemente();

		// Gridbaglayout holen
		
	    GridBagLayout gbl = new GridBagLayout();
	    GridBagConstraints constr = new GridBagConstraints();

	    // ContentPane holen
	    
	    Container cpane = this.getContentPane();
	    cpane.setLayout (new BorderLayout());
	    
	    // Panels holen und mit GridBagLayout versehen

	    JPanel topPanel = new JPanel();
	    JPanel downPanel = new JPanel ();
	    topPanel.setLayout(gbl);
	    downPanel.setLayout(gbl);
	    
	    // Panel "oben" mit Elementen aus der Klasse FensterElemente füllen
	    
	    //JLabel erstellen
	    constr.gridx = 1;	//Spalte
	    constr.gridy = 0;	//Zeile
	    constr.anchor = GridBagConstraints.CENTER;	    
	    topPanel.add(element.createJLabel("Sitzplatzreservierung"), constr);
	    
	    //JLabel erstellen
	    constr.gridx = 0;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    topPanel.add(element.createJLabel("Name"), constr);
	    
	    //TextField erstellen
	    constr.gridx = 1;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    JTextField nameField = element.createTextField(20);
	    topPanel.add(nameField, constr);	    
	    
	    //JLabel erstellen
	    constr.gridx = 0;
	    constr.gridy = 2;
	    constr.anchor = GridBagConstraints.EAST;
	    topPanel.add(element.createJLabel("Email"), constr);	    

	    //TextField erstellen
	    constr.gridx = 1;
	    constr.gridy = 2;
	    constr.anchor = GridBagConstraints.EAST;
	    topPanel.add(element.createTextField(20), constr);
	    
	    //Button erstellen
	    constr.gridx = 2;
	    constr.gridy = 3;
	    constr.anchor = GridBagConstraints.WEST;
	    JButton button = (JButton) element.createButton("OK");
	    topPanel.add(button, constr);
	    EventHandling bl = new EventHandling(); 
	    button.addActionListener(bl);	    

	    //TextArea erstellen
	    constr.gridx = 1;
	    constr.gridy = 4;
	    constr.anchor = GridBagConstraints.CENTER;
	    topPanel.add(element.createTextArea(3,19), constr);  

	    //Panel "unten" mit Elementen aus der Klasse FensterElemente füllen

	    //RadioButtons erstellen
	    constr.gridx = 0;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.WEST;
	    String[] title = new String[]{"Raucher", "Nichtraucher"};
	    boolean[] active = new boolean[]{ true, false};
	    downPanel.add(element.createRadioButtons(title, active), constr);

	    //ComboBox erstellen
	    constr.gridx = 1;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.NORTHWEST;
	    String[] content = new String[]{"Fensterplatz","Mittelgang","Loge","Schlafplatz"};
	    downPanel.add(element.createComboBox(content), constr);
	    
	    //Leeres JLabel erstellen
        constr.gridx = 2;
        constr.gridy = 1;
        constr.anchor = GridBagConstraints.WEST;
        downPanel.add(element.createEmptyJLabel(30), constr);	    

        //Checkboxen erstellen
	    constr.gridx = 3;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    constr.gridwidth = GridBagConstraints.REMAINDER;
	    String[] inhalt = new String[]{"Handgepäck","Koffer"};
	    boolean[] status = new boolean[]{false,true};
	    downPanel.add(element.createCheckBox(inhalt,status), constr);
	    
	    //Leeres JLabel erstellen
        constr.gridx = 0;
        constr.gridy = 2;
        constr.anchor = GridBagConstraints.WEST;
        downPanel.add(element.createEmptyJLabel(30), constr);
        
	    //Leeres JLabel erstellen
        constr.gridx = 0;
        constr.gridy = 3;
        constr.anchor = GridBagConstraints.WEST;
        downPanel.add(element.createEmptyJLabel(30), constr);
        
	    //Leeres JLabel erstellen
        constr.gridx = 0;
        constr.gridy = 4;
        constr.anchor = GridBagConstraints.WEST;        
        downPanel.add(element.createEmptyJLabel(30), constr);        
    
	    
	    // fertige topPanel und downPanel auf cpane legen
	    cpane.add(topPanel, BorderLayout.NORTH);
        cpane.add(downPanel, BorderLayout.SOUTH); 
	}
	class EventHandling implements ActionListener{
		public void actionPerformed(ActionEvent event){	
			contentNameField = nameField.getText();
			System.out.println("Inhalt NameField: " + contentNameField);
		}	
	}
}//Ende der Klasse ReservierungsFenster
 
Hallo,

du legst das Textfeld einmal als Klassenvariable an, das ist ja schon mal richtig
Java:
class ReservierungsFenster extends JFrame{
	private static final long serialVersionUID = 1L;
	String contentNameField;
	public JTextField nameField;

und du legst es einmal bei hinzufügen zum Panel an
Java:
 //TextField erstellen
	    constr.gridx = 1;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    JTextField nameField = element.createTextField(20);
	    topPanel.add(nameField, constr);

Damit hast du es ja in einer ganz anderen Variablen gespeichert als du in der actionPerformed nutzt. Hier solltest du es nicht neu anlegen.

Java:
 //TextField erstellen
	    constr.gridx = 1;
	    constr.gridy = 1;
	    constr.anchor = GridBagConstraints.EAST;
	    nameField = element.createTextField(20);
	    topPanel.add(nameField, constr);

So müsste es nun funktionieren.

MFG

zEriX
 
Zurück