JTextField - Inhalt abholen

mr_waiter

Grünschnabel
Hallo zusammen,

ich bin gerade dabei eine Java-Anwendung zu schreiben. Die Programmoberfläche besteht im wesentlichen aus vielen Eingabefeldern (verteilt auf verschiedene Tabs) und Schaltflächen zum weiterverarbeiten der Eingaben.

Da die Oberfläche mittlerweile sehr umfangreich wurde habe ich den Inhalt der einzelnen Tabs in eigene Klassen geschrieben.
Jetzt habe ich Schwierigkeiten, auf den Inhalt der Eingabefelder zuzugreifen.

Ich habe hier mal ein vereinfachtes Beispiel vorbereitet, um meine Frage zu verdeutlichen:

1. ein Panel mit einem JTextfield:
Java:
import javax.swing.*;

public class PanelMitFeld {
	
	public JPanel erstellePanelMitFeld(){
		
		panelMitFeld = new JPanel();
		feld1 = new JTextField("text123",15);
		panelMitFeld.add(feld1);		
		return panelMitFeld;			
	}
	
	public String holeFeldInhalt(){
		
		String strFeldInhalt = feld1.getText();
		return strFeldInhalt;
	}
	
	private JPanel panelMitFeld;
	private JTextField feld1;
}

2. ein Panel mit einem JButton, der die Weiterverarbeitung anstossen soll:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class PanelMitButton implements ActionListener {
	
	public JPanel erstellePanelMitButton(){
		
		panelMitButton = new JPanel();
		btnButton = new JButton("click me");
		btnButton.addActionListener(this);
		panelMitButton.add(btnButton);		
		return panelMitButton;
	}
	
	public void actionPerformed(ActionEvent e) {
		neuPanelMitFeld = new PanelMitFeld();
		System.out.println(neuPanelMitFeld.holeFeldInhalt());
		
	}
	
	private JPanel panelMitButton;
	private JButton btnButton;
	PanelMitFeld neuPanelMitFeld;

}

Wenn ich das Programm ausführe und auf den Button drücke, erhalte ich eine Fehlermeldung beim Ausführen der Methode holeFeldInhalt().

Meine Frage: was habe ich denn hier Falsch gemacht?

Vielen Dank,
Jens
 
Moin,

das liegt daran, dass Dein TextFeld gar nicht initialisiert ist, sondern eben nur deklariert wird - im zweiten Codeteil.

Generell verstehe ich nicht, wieso Du mit einer getter-Methode Deine ganzen Komponenten zu initialisieren versuchst, normalerweise macht man das mit einem Konstruktor.
Vielleicht hat es ja einen tieferen Sinn, keine Ahnung.

Aber ich für meinen Teil würde Dir vorschlagen, die Panel von der JPanel-Klasse abzuleiten.

Teil 1:
Java:
import javax.swing.JPanel;
import javax.swing.JTextField;

public class PanelMitFeld extends JPanel {
    private JTextField feld = null;

    public PanelMitFeld() {
        feld = new JTextField("text123", 15);
        add(feld);
    }

    public String holeFeldInhalt() {
        return feld.getText();
    }
}

Teil 2:
Java:
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JPanel;

public class PanelMitButton extends JPanel implements ActionListener {
    private JButton      button = null;
    private PanelMitFeld panel  = null;

    public PanelMitButton() {
        panel  = new PanelMitFeld();
        button = new JButton("click me");
        button.addActionListener(this);
        add(button);
    }

    public void actionPerformed(ActionEvent e) {
        System.out.println(panel.holeFeldInhalt());
    }
}

Gruß,
Xan
 
Vielen Dank erstmal für Deine rasche Antwort.

Ich habe Deine Anregungen aufgenommen und bekomme jetzt auch den Feldinhalt geliefert.

Allerdings bekomme ich nach einer Änderung im Textfeld und nach Betätigung des Buttons nicht den aktualisierten Feldinhalt.
Ich habe hierfür einen DocumentLister hinzugefügt. Der reagiert auch wie gewollt auf die Eingaben, allerdings bekomme ich immernoch den "alten" Feldinhalt ausgegeben, wenn ich aufs Knöpfchen drücke.

Das ganze sieht jetzt, wie folgt, aus:

1. Teil

Java:
public class PanelMitFeld extends JPanel {
	
	PanelMitFeld(){		
		DocumentListener docListener = new MyDocListener();
		panelMitFeld = new JPanel();
		feld1 = new JTextField("Vorbelegung",15);
		feld1.getDocument().addDocumentListener(docListener);
		panelMitFeld.add(feld1);
		strFeld1 = "";		
	}
	
	public JPanel erstellePanelMitFeld(){			
		return panelMitFeld;			
	}
	
	public String holeFeldInhalt(){		
		strFeld1 = feld1.getText();
		return strFeld1;
	}
	
	public void aktualisiereFeldInhalt(){		
		strFeld1 = feld1.getText();
		System.out.println("docListener: " + strFeld1); // Ausgabe okay 

	}
	
	private JPanel panelMitFeld;
	private JTextField feld1;
	private String strFeld1;
	
	private class MyDocListener implements DocumentListener{		

		public void insertUpdate(DocumentEvent arg0) {
			aktualisiereFeldInhalt();			
		}

		public void removeUpdate(DocumentEvent arg0) {
			aktualisiereFeldInhalt();			
		}	
		public void changedUpdate(DocumentEvent arg0) {}
	}
}

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

public class PanelMitButton extends JPanel implements ActionListener {
	
	PanelMitButton(){
		panelMitButton = new JPanel();
		btnButton = new JButton("click me");
		btnButton.addActionListener(this);
		panelMitButton.add(btnButton);	
		neuPanelMitFeld = new PanelMitFeld();		
	}
	
	public JPanel erstellePanelMitButton(){					
		return panelMitButton;
	}
	
	public void actionPerformed(ActionEvent e) {		// Ausgabe immer  "Vorbelegung"
		System.out.println("nach Action: " + neuPanelMitFeld.holeFeldInhalt());		
	}
	
	private JPanel panelMitButton;
	private JButton btnButton;
	private PanelMitFeld neuPanelMitFeld;
}
 
Du musst deine Abfrage in den EDT (Event-Dispatch-Thread) auslagern.

bsp:

PHP:
SwingUtilities.invokeLater(new Runnable() {
  public void run() {
    // do something
  }
});
 
Zurück