Problem mit JTextField und actionPerformed

Valentin-

Erfahrenes Mitglied
Hi,
ich bin dabei mich in Java einzuarbeiten und habe vorher schon mit .NET etc. gearbeitet.
Nun habe ich aber eine Frage zu folgendem Codestück:
PHP:
public void actionPerformed(ActionEvent e) {
		try {
			Name = NTextField.getText();
			Password = PTextField.getText();
		}
		catch(NullPointerException err)
		{
			System.out.println(err);
		}
}
Und zwar sind beide JTextFields in der Class definiert. Von .NET kenne ich
es so, dass man ganz einfach wiederum auf das TextField mit dem Namen
wie ich es gemacht habe zugreifen kann.
Leider bekommen ich aber genau in der Zeile eine NullPointerException.
Deshalb meine Frage: Was mache ich falsch?
Wäre dankbar für Hilfe.

Bye
 
PHP:
public void actionPerformed(ActionEvent e) {
        try {
            Name = NTextField.getText();
            Password = PTextField.getText();
        }
        catch(NullPointerException err)
        {
            System.out.println(err);
        }
}

wenn die variablen Name und Password ebenfalls in der classe defeniert sind würde es keinen fehler geben!
du brauchst kein try..

richtig wäre es wenn du folgendes machst
PHP:
public void actionPerformed(ActionEvent e) {
   if(e.getActionCommand().equals("nameDesTextFields")){
      System.out.println(NTextField.getText());
      //....
   }
   if(e.getActionCommand().equals("nameDesTextFields2")){
      System.out.println(PTextField.getText());
      //....
   }
}
vorrausgesetzt natürlich das in der klasse die variablen n... und p... exestieren
 
Gut ich habe das jetzt genau so gemacht wie du sagtest. Bekomme jetzt
zwar keine Fehlermeldung mehr, aber den Text des TextFields gibt er jedoch nicht
aus.
Das sowohl mit Anführungszeichen im equals als auch ohne.
PHP:
public void actionPerformed(ActionEvent e) {
		if (e.getActionCommand().equals(NTextField)) {
			RLabel.setText("Fine");
		}
		if (e.getActionCommand().equals(PTextField)) {
			System.out.println(PTextField.getText());
			RLabel.setText("Finer");
		}

	}
Das ist der Code.
Vielen Dank für deine Hilfe.

Bye
 
Servus!

Code:
/*
 * Created on 11.12.2003
 *
 * To change the template for this generated file go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.WindowAdapter;
import java.awt.event.WindowEvent;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;


/**
 * @author Darimont
 *
 * To change the template for this generated type comment go to
 * Window>Preferences>Java>Code Generation>Code and Comments
 */
public class TextTest extends JFrame {

	private String name;
	private String password;

	public TextTest() {
		super("TextTest");
		setSize(320, 130);

		addWindowListener(new WindowAdapter() {
			public void windowClosing(WindowEvent event) {
				setVisible(false);
				dispose();
				System.exit(0);
			}
		});

		JPanel panel = new JPanel();
		JLabel label1 = new JLabel("Name: ");
		final JTextField jtf1 = new JTextField(20);
		jtf1.setColumns(20);
		jtf1.setText("username");
		JLabel label2 = new JLabel("Password: ");
		final JTextField jtf2 = new JTextField(20);
		jtf2.setColumns(20);
		jtf2.setText("password");
		JButton jbtn = new JButton("Push me");
		jbtn.addActionListener(new ActionListener() {

			public void actionPerformed(ActionEvent arg0) {
				// TODO Auto-generated method stub
				name = jtf1.getText() == null ? "" : jtf1.getText();
				password = jtf2.getText() == null ? "" : jtf2.getText();

				System.out.println("Name: " + name + " Password: " + password);
			}

		});

				
		panel.setLayout(new FlowLayout());
		panel.add(label1);
		panel.add(jtf1);
		panel.add(label2);
		panel.add(jtf2);
		panel.add(jbtn);

		getContentPane().add(panel);
		setVisible(true);
	}

	public static void main(String[] args) {
		new TextTest();
	}
}

Gruß Tom
 
Zuletzt bearbeitet:
Zunächst mal vielen Dank für deine Antwort Tom.
Wenn ich es nun so mache wie du in deinem Beispiel vorschlägst
bekomme ich folgende Fehlermeldung:

Error Cannot refer to a non-final variable PTextField inside an inner class defined in a different method LessonOne.java WorkBench/src line 46

Was sich auf diese Zeile bezieht:
Password = PTextField.getText() == null ? "": PTextField.getText();

Danke für deine Hilfe.

P.S. gibt es eigentlich schon den GUI-Builder für Eclipse, den IBM dem
Eclipse Consortium vor einiger Zeit gespendet hat?

Bye
 
Super vielen Dank Thomas, funktioniert jetzt.
Könntest du mir noch einen Link nennen der erklärt warum es als Final
definiert werden muss?

Bye
 
Ich versteh nicht wieso du es für notwendig hällst in deinem beispiel den event in einem sub konstruktor zu erstellen
das macht alles nur ziemlich unübersichtlich ^^

zunächst würde ich dir eh mal empfehlen wenn du mit GUI arbeitest das du dir deinen WindowEvent erstmal in ne eigene klasse wirfst!
PHP:
import java.awt.event.*;

public class WindowClosingAdapter
extends WindowAdapter
{
  private boolean exitSystem;

  /**
   * Erzeugt einen WindowClosingAdapter zum Schliessen
   * des Fensters. Ist exitSystem true, wird das komplette
   * Programm beendet.
   */
  public WindowClosingAdapter(boolean exitSystem)
  {
	this.exitSystem = exitSystem;
  }

  /**
   * Erzeugt einen WindowClosingAdapter zum Schliessen
   * des Fensters. Das Programm wird nicht beendet.
   */
  public WindowClosingAdapter()
  {
	this(false);
  }

  public void windowClosing(WindowEvent event)
  {
	event.getWindow().setVisible(false);
	event.getWindow().dispose();
	if (exitSystem) {
	  System.exit(0);
	}
  }
}
dann brauchste den nicht ständig neu schreiben!

die benutzung ist dann easy
einfach in den default konstruktor deiner klasse reinwerfen
PHP:
import java.awt.Frame;
class ClassName extends Frame{
public ClassName() {
	super("Titel");
	addWindowListener(new WindowClosingAdapter(true));
	setVisible(true);
}
}

der code von Tom würde wenn alles fertig ist dann so aussehen

PHP:
package com.cephei.sst.test;

import java.awt.FlowLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JTextField;

import com.cephei.sst.utils.WindowClosingAdapter;

/**
 * @author Darimont
 *
 */
public class TextTest extends JFrame implements ActionListener {

	private String name;
	private String password;
	private final JTextField jtf1;
	private final JTextField jtf2;
	private final JButton jbtn;
	
	public TextTest() {
		super("TextTest");
		addWindowListener(new WindowClosingAdapter(true));
		setSize(320, 130);
		JPanel panel = new JPanel();
		panel.setLayout(new FlowLayout());
		getContentPane().add(panel);
				
		/* top */
		JLabel label1 = new JLabel("Name:         ");
		panel.add(label1);
		
		jtf1 = new JTextField(20);
		jtf1.setColumns(20);
		jtf1.setText("username");
		panel.add(jtf1);
		
		/* bottom */
		JLabel label2 = new JLabel("Password: ");
		panel.add(label2);
		
		jtf2 = new JTextField(20);
		jtf2.setColumns(20);
		jtf2.setText("password");
		panel.add(jtf2);
		
		/* and the button */
		jbtn = new JButton("Push me");
		jbtn.addActionListener(this);
		panel.add(jbtn);
				
		setVisible(true);
	}

	public void actionPerformed(ActionEvent e) {
		name = jtf1.getText() == null ? "" : jtf1.getText();
		password = jtf2.getText() == null ? "" : jtf2.getText();
		System.out.println("Name:	" + name);
		System.out.println("Password:	" + password);
	}

	public static void main(String[] args) {
		new TextTest();
	}
}

schon etwas übersichtlicher findest du nicht?
 
Zuletzt bearbeitet:
Zurück