PropertyChangeListener an JFormattedTextField

nuely

Grünschnabel
Ich habe ein Programm, welches ich nicht selbst geschrieben habe, sondern jetzt nur vollenden soll. Es besitzt mehrere JFormattedTextFields, welche jeweils einen PropertyChangeListener besitzen. Die Listener arbeiten im Endeffekt alle gleich. Sie fragen ab, ob field.getValue()!=null ist und führen dann eine Aktion mit dem Inhalt aus. Das funktioniert auch soweit. Nur bei einem Textfield ist getValue() immer null, auch wenn er einen Inhalt hat.
Letztendlich habe ich jetzt versucht das Problem in einem kleinen Beispiel außerhalb des großen Programms zu stoßen und habe zwei der TextFields mitgenommen.
Jetzt kommt es schon beim Aufruf des Programms zu einer NullPointer, wenn ich getValue() abfrage. Wie kommt das?

Code:
import javax.swing.SwingUtilities;
import java.awt.GridBagConstraints;
import java.beans.PropertyChangeEvent;
import java.beans.PropertyChangeListener;

import javax.swing.JFormattedTextField;
import javax.swing.JPanel;
import javax.swing.JFrame;

import java.awt.GridBagLayout;

public class TextFieldTest extends JFrame {

	private static final long serialVersionUID = 1L;
	private JPanel jContentPane = null;
	private JFormattedTextField gebgeweingabe;
	private JFormattedTextField gebeingabe;
	
	public static void main(String[] args) {
		SwingUtilities.invokeLater(new Runnable() {
			public void run() {
				TextFieldTest thisClass = new TextFieldTest();
				thisClass.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
				thisClass.setVisible(true);
			}
		});
	}

	public TextFieldTest() {
		super();
		initialize();
	}

	private void initialize() {
		this.setSize(300, 200);
		this.setContentPane(getJContentPane());
		this.setTitle("JFrame");
	}

	private JPanel getJContentPane() {
		if (jContentPane == null) {
			
			GridBagConstraints gridBagConstraints1 = new GridBagConstraints();
			gridBagConstraints1.fill = GridBagConstraints.BOTH;
			gridBagConstraints1.gridy = 1;
			gridBagConstraints1.weightx = 1.0;
			gridBagConstraints1.gridx = 0;
			GridBagConstraints gridBagConstraints = new GridBagConstraints();
			gridBagConstraints.fill = GridBagConstraints.BOTH;
			gridBagConstraints.gridy = 0;
			gridBagConstraints.weightx = 1.0;
			gridBagConstraints.gridx = 0;
			jContentPane = new JPanel();
			jContentPane.setLayout(new GridBagLayout());
			jContentPane.add(formattedTextFieldGebindeGewicht(), gridBagConstraints);
			jContentPane.add(formattedTextFieldGebinde(), gridBagConstraints1);
		}
		return jContentPane;
	}
	private JFormattedTextField formattedTextFieldGebindeGewicht() {
		JFormattedTextField gebgeweingabe = new JFormattedTextField();
		gebgeweingabe.setValue(null); 
		gebgeweingabe.addPropertyChangeListener(new FieldGebindeGewicht());
		return gebgeweingabe;
	}
	
	private JFormattedTextField formattedTextFieldGebinde() {
		JFormattedTextField gebeingabe = new JFormattedTextField();
		gebeingabe.setValue(null);
		gebeingabe.addPropertyChangeListener(new FieldGebinde());
		return gebeingabe;
	}
	
	class FieldGebinde implements PropertyChangeListener
	{
		public void propertyChange(PropertyChangeEvent e)
		{
			System.out.println(gebeingabe.getValue());
			if(gebeingabe.getValue()!=null)
			{
				System.out.println("ein wert wurde eingegeben");
			}
		}	
	}
	
	class FieldGebindeGewicht implements PropertyChangeListener
	{
		public void propertyChange(PropertyChangeEvent e)
		{
			System.out.println(gebgeweingabe.getValue());
			if(gebgeweingabe.getValue()!=null)
			{
				System.out.println("Ein Wert wurde eingegeben");
			}
		}
	}
}

Das Ziel ist, dass ein Ereignis ausgeführt wird, wenn das Feld verlassen wird. Sei das Verlassen durch Enter, Tab oder Mausklick. Da dafür verschiedene Listener notwendig wären, wurde wohl der PropertyChangeListener gewählt, welcher in allen drei Fällen immer auslöst. Das er auch beim Erhalt des Fokus auslöst kann ignoriert werden. Ich habe auch den DocumentListener gefunden und getestet, dieser löst jedoch bei jedem eingegebenen Zeichen aus.
Oder gibt es alternative Vorschläge wie ich das anders lösen könnte?
 
Hi,

versuch's mal so:

Java:
private JFormattedTextField formattedTextFieldGebindeGewicht() {
		//JFormattedTextField gebgeweingabe = new JFormattedTextField();
		gebgeweingabe = new JFormattedTextField();
		gebgeweingabe.setValue(new String()); 
		gebgeweingabe.addPropertyChangeListener(new FieldGebindeGewicht());
		return gebgeweingabe;
	}
	
	private JFormattedTextField formattedTextFieldGebinde() {
		//JFormattedTextField gebeingabe = new JFormattedTextField();
		gebeingabe = new JFormattedTextField();
		gebeingabe.setValue(new String());
		gebeingabe.addPropertyChangeListener(new FieldGebinde());
		return gebeingabe;
	}

Gruß
joschi
 
Zurück