Swing JTextField getText() liefert leeren String

reason4u2

Mitglied
Hi,

ich habe eine JFrame mit einem CardLayout. In der Manager Klasse soll von dem momentan geöffneten Panel die Textfelder abgefragt werden, aber wenn ich dann etwas in die Felder schreibe und es mir in der Konsole ausgeben lasse, sind die Strings leer.

Zum Auslesen (momentan nur case "WwM"):
Java:
JButton btnNewButton = new JButton("Frage speichern und weiter");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Question q;
				switch(comboBox.getSelectedItem().toString()) {
				case "WwM":
					q = new Question("WwM", (wwM.getValue()));
					addWwMQuestion(q);
					break;
				case "Multiple Choise":
					
					break;
				}
			}
		});

Java:
public void addWwMQuestion(Question q) {
		q.addAnswers(wwM.getAnswer("A"), wwM.isRigth("A"));
		q.addAnswers(wwM.getAnswer("B"), wwM.isRigth("B"));
		q.addAnswers(wwM.getAnswer("C"), wwM.isRigth("C"));
		q.addAnswers(wwM.getAnswer("D"), wwM.isRigth("D"));
		questions.add(q);
		Question tq = questions.get(0);
		System.out.println(tq.getValue() + " A: " + tq.getAnswers().get(0).getValue() + " " + tq.getAnswers().get(0).isRigth());
		System.out.println(tq.getValue() + " B: " + tq.getAnswers().get(1).getValue() + " " + tq.getAnswers().get(1).isRigth());
		System.out.println(tq.getValue() + " C: " + tq.getAnswers().get(2).getValue() + " " + tq.getAnswers().get(2).isRigth());
		System.out.println(tq.getValue() + " D: " + tq.getAnswers().get(3).getValue() + " " + tq.getAnswers().get(3).isRigth());
	}

Auch die auswahl der RadioButtons(rdbtnX) ist immer die start Einstellung, wenn ich einen anderen Auswähle ändert sich an der Ausgabe nichts.
Java:
public String getValue() {
		return textField.getText();
	}

	public boolean isRigth(String ch) {
		switch (ch) {
		case "A":
			return rdbtnA.isSelected();
		case "B":
			return rdbtnB.isSelected();
		case "C":
			return rdbtnC.isSelected();
		case "D":
			return rdbtnD.isSelected();
		}
		return false;
	}
	
	public String getAnswer(String ch) {
		switch (ch) {
		case "A":
			return textField_1.getText();
		case "B":
			return textField_2.getText();
		case "C":
			return textField_3.getText();
		case "D":
			return textField_4.getText();
		}
		return null;
	}

Die Ausgabe:
A: true
B: false
C: false
D: false

Wie sie eigentlich sein sollte:
Frage A: Antwort false
Frage B: Antwort false
Frage C: Antwort true
Frage D: Antwort false

Der Frage und Antwort String fehlt und der boolean Wert ist nicht richtig.
 
der Code enthält nichts konkretes, man weiß nicht welche Komponenten was machen, man hat kein Gefühl für den Ablauf,
möglich ist mit beliebigen Codeausschnitten immer alles, wobei kein Fehler direkt sichtbar ist, wenn das deine Frage ist

nur vollständige Programme mit ungefährer Beschreibung des Ablaufs/ der Bedienung lassen nachvollziehen, welche Komponente was enthält

ein häufiger Fehler sind doppelte GUI-Elemente, Gruppe A wird angezeigt und enthält das richtige,
Gruppe B wird verwendet mit Standardwerten
 
Diese Klasse hat eine JComboBox mit der man zwichen WwMPanel und MultipleChoisePanel mit Hilfe eines CardLayouts wechseln kann.

Wenn nun der "Speichern und weiter" Buton gedrückt wird und das WwMPanel ausgewählt ist, sollen die Textfelder in der Klasse Frage und Antwort gespeichert werden. Value = textField()WwMPanel; Antworten: A = textfield_1, b = textfield_2, C = textfield_4, D = textfield_5(WwMPanel) und der ausgewählte RadioButton, dh. wenn RadioButton B gewählt ist soll Antwort B rigth = true haben.
Nicht wundern wenn es etwas seltsam aussieht, ist mit dem WindowBuilder in Eclipse gemacht.
Java:
public class QuestionPanel extends JPanel {

	private static final String[] QUESTION_STRINGS = { "WwM", "Multiple Choise"};
	
	private JPanel cardPanel;
	private CardLayout cardLayout;
	@SuppressWarnings("rawtypes")
	private JComboBox comboBox;
	
	private ArrayList<Question> questions;
	
	private WwMPanel wwM;
	@SuppressWarnings("unused")
	private MultipleChoisePanel mC;
	
	/**
	 * Create the panel.
	 */
	@SuppressWarnings({ "unchecked", "rawtypes" })
	public QuestionPanel() {
		questions = new ArrayList<Question>();
		
		setLayout(new BorderLayout(0, 0));
		
		cardLayout = new CardLayout();
		cardPanel = new JPanel(cardLayout);
		
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		
		JLabel lblTyp = new JLabel("Typ");
		panel.add(lblTyp);
		comboBox = new JComboBox(QUESTION_STRINGS);
		comboBox.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				JComboBox cb = (JComboBox) arg0.getSource();
				cardLayout.show(cardPanel, cb.getSelectedItem().toString());
			}
		});
		comboBox.setSelectedIndex(0);
		panel.add(comboBox);
		
		JButton btnBildEinfgen = new JButton("Bild einf\u00FCgen");
		panel.add(btnBildEinfgen);
		
		JLabel lblPfad = new JLabel("Pfad");
		panel.add(lblPfad);
		
		JPanel helperPanel = new JPanel(new BorderLayout());
        helperPanel.add(new JSeparator(SwingConstants.HORIZONTAL), BorderLayout.SOUTH);
        helperPanel.add(panel, BorderLayout.NORTH);
		
		JPanel panel_1 = new JPanel();
		panel_1.setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
		
		JButton btnVorschau = new JButton("Vorschau");
		panel_1.add(btnVorschau);
		
		JPanel helperPanel_1 = new JPanel(new BorderLayout());
		helperPanel_1.add(new JSeparator(SwingConstants.HORIZONTAL), BorderLayout.NORTH);
		helperPanel_1.add(panel_1, BorderLayout.SOUTH);
		
		JButton btnNewButton = new JButton("Frage speichern und weiter");
		btnNewButton.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				Question q;
				switch(comboBox.getSelectedItem().toString()) {
				case "WwM":
					q = new Question("WwM", (wwM.getValue())); // hier ist Zeile 86
					addWwMQuestion(q);
					break;
				case "Multiple Choise":
					
					break;
				}
			}
		});
		panel_1.add(btnNewButton);
		
		cardPanel.add(new WwMPanel(), QUESTION_STRINGS[0]);
		cardPanel.add(new MultipleChoisePanel(), QUESTION_STRINGS[1]);
		//usw.
		
		add(cardPanel, BorderLayout.CENTER);
		
		add(helperPanel, BorderLayout.NORTH);
		add(helperPanel_1, BorderLayout.SOUTH);
	}
	
	public void addWwMQuestion(Question q) {
		q.addAnswers(wwM.getAnswer("A"), wwM.isRigth("A"));
		q.addAnswers(wwM.getAnswer("B"), wwM.isRigth("B"));
		q.addAnswers(wwM.getAnswer("C"), wwM.isRigth("C"));
		q.addAnswers(wwM.getAnswer("D"), wwM.isRigth("D"));
		questions.add(q);
		Question tq = questions.get(0);
		System.out.println(tq.getValue() + " A: " + tq.getAnswers().get(0).getValue() + " " + tq.getAnswers().get(0).isRigth());
		System.out.println(tq.getValue() + " B: " + tq.getAnswers().get(1).getValue() + " " + tq.getAnswers().get(1).isRigth());
		System.out.println(tq.getValue() + " C: " + tq.getAnswers().get(2).getValue() + " " + tq.getAnswers().get(2).isRigth());
		System.out.println(tq.getValue() + " D: " + tq.getAnswers().get(3).getValue() + " " + tq.getAnswers().get(3).isRigth());
	}

}

Java:
public class WwMPanel extends JPanel {
	private JTextField textField;
	private JTextField textField_1;
	private JTextField textField_2;
	private JTextField textField_3;
	private JTextField textField_4;
	private JTextField textField_5;
	
	private JRadioButton rdbtnA;
	private JRadioButton rdbtnB;
	private JRadioButton rdbtnC;
	private JRadioButton rdbtnD;

	/**
	 * Create the panel.
	 */
	public WwMPanel() {
		setLayout(null);
		
		textField = new JTextField();
		textField.setBounds(98, 42, 307, 20);
		add(textField);
		textField.setColumns(10);
		
		JLabel lblFrage = new JLabel("Frage:");
		lblFrage.setBounds(56, 45, 46, 14);
		add(lblFrage);
		
		textField_1 = new JTextField();
		textField_1.setBounds(98, 73, 129, 20);
		add(textField_1);
		textField_1.setColumns(10);
		
		textField_2 = new JTextField();
		textField_2.setBounds(276, 73, 129, 20);
		add(textField_2);
		textField_2.setColumns(10);
		
		textField_3 = new JTextField();
		textField_3.setBounds(98, 104, 129, 20);
		add(textField_3);
		textField_3.setColumns(10);
		
		textField_4 = new JTextField();
		textField_4.setBounds(276, 104, 129, 20);
		add(textField_4);
		textField_4.setColumns(10);
		
		rdbtnA = new JRadioButton("A:");
		rdbtnA.setSelected(true);
		rdbtnA.setBounds(56, 72, 37, 23);
		add(rdbtnA);
		
		rdbtnC = new JRadioButton("C:");
		rdbtnC.setBounds(56, 103, 37, 23);
		add(rdbtnC);
		
		rdbtnB = new JRadioButton("B:");
		rdbtnB.setBounds(233, 72, 37, 23);
		add(rdbtnB);
		
		rdbtnD = new JRadioButton("D:");
		rdbtnD.setBounds(233, 103, 37, 23);
		add(rdbtnD);
		
		ButtonGroup group = new ButtonGroup();
		group.add(rdbtnA);
		group.add(rdbtnC);
		group.add(rdbtnB);
		group.add(rdbtnD);
		
		JLabel lblPunkte = new JLabel("Punkte:");
		lblPunkte.setBounds(56, 138, 37, 14);
		add(lblPunkte);
		
		textField_5 = new JTextField();
		textField_5.setBounds(98, 135, 37, 20);
		add(textField_5);
		textField_5.setColumns(10);

	}

	public String getValue() {
		return textField.getText();
	}

	public boolean isRigth(String ch) {
		switch (ch) {
		case "A":
			return rdbtnA.isSelected();
		case "B":
			return rdbtnB.isSelected();
		case "C":
			return rdbtnC.isSelected();
		case "D":
			return rdbtnD.isSelected();
		}
		return false;
	}
	
	public String getAnswer(String ch) {
		switch (ch) {
		case "A":
			return textField_1.getText();
		case "B":
			return textField_2.getText();
		case "C":
			return textField_3.getText();
		case "D":
			return textField_4.getText();
		}
		return null;
	}
	
}

Java:
public class Question {

	private String typ;
	private String value;
	private int score;
	private ArrayList<Answer> answers;
	
	public Question(String t, String v) {
		typ = t;
		value = v;
		answers = new ArrayList<Answer>();
	}
	
	public String getTyp() {
		return typ;
	}

	public String getValue() {
		return value;
	}

	public ArrayList<Answer> getAnswers() {
		return answers;
	}
	
	public void addAnswers(String value, boolean rigth) {
		Answer a = new Answer(value, rigth);
		answers.add(a);
	}
}

Java:
public class Answer {

	private String value;
	private boolean rigth;
	
	public Answer(String v, boolean r) {
		value = v;
		rigth = r;
	}

	public String getValue() {
		return value;
	}

	public boolean isRigth() {
		return rigth;
	}

}

Und noch das Bild zur Übersicht

Seltsamerweiße bekomme ich jetzt eine Fehlermeldung, obwohl ich nichts geändert habe ...
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at gui.QuestionPanel$2.actionPerformed(QuestionPanel.java:86)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.fireActionPerformed(Unknown Source)
at javax.swing.DefaultButtonModel.setPressed(Unknown Source)
at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(Unknown Source)
at java.awt.Component.processMouseEvent(Unknown Source)
at javax.swing.JComponent.processMouseEvent(Unknown Source)
at java.awt.Component.processEvent(Unknown Source)
at java.awt.Container.processEvent(Unknown Source)
at java.awt.Component.dispatchEventImpl(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.LightweightDispatcher.retargetMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.processMouseEvent(Unknown Source)
at java.awt.LightweightDispatcher.dispatchEvent(Unknown Source)
at java.awt.Container.dispatchEventImpl(Unknown Source)
at java.awt.Window.dispatchEventImpl(Unknown Source)
at java.awt.Component.dispatchEvent(Unknown Source)
at java.awt.EventQueue.dispatchEventImpl(Unknown Source)
at java.awt.EventQueue.access$000(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.awt.EventQueue$3.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.awt.EventQueue$4.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.security.ProtectionDomain$1.doIntersectionPrivilege(Unknown Source)
at java.awt.EventQueue.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForFilters(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForFilter(Unknown Source)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.pumpEvents(Unknown Source)
at java.awt.EventDispatchThread.run(Unknown Source)
 

Anhänge

  • Problem.PNG
    Problem.PNG
    19,3 KB · Aufrufe: 34
was ist wwM?

hier
> cardPanel.add(new WwMPanel(), QUESTION_STRINGS[0]);
fügst du direkt ein WwMPanel ein, wwM bleibt null oder wie gesagt ist zu befürchten, dass ein zweites WwMPanel erstellt wird,
einmal die Variable korrekt setzen, das dann auch ins CardLayout rein
 
Vielen Dank, genau das wars, hab vergessen das zu ändern, nachdem ich mich mit der Umsetzung umentschieden hat, da hätt ich ja nie gesucht ^^
 
genau da ist aber die einzige oder zumindest erste Stelle, wo zu suchen ist, da denke drüber nach
 
tut mir leid, aber das musst du mir erklären, das ich mir nicht gemerkt habe das zu ändern war dumm, das weiß ich, aber so dachte ich, dass die NullPointerException(q = new Question("WwM", (wwM.getValue()))😉 sich auf q bezieht, ok im Nachhinein war das auch dumm und sinnlos, aber ich hatte irgendwie das gefühl das es am cardlayout liegt(wars im endeffekt ja mehr oder weniger auch)
 

Zurück
Oben