Erste Schritte GUI - ActionListener - Exception Nullpointer

camou

Mitglied
Hallo erstmal an alle, bin neu hier hehe.

Beschäftige mich ein bisschen mit Java und wollte mich auch mal mit einer grafischen Oberfläche befassen. Die Funktion des Programms ist recht nutzlos 😀, naja also auch wenn es funktionieren würde...

Habe zwei Buttons und je nach dem welchen ich drücke soll sich der Inhalt des JTextArea-Feldes ändern. Ist für mich einfach ne Übung mit mehreren Buttons zu arbeiten.

Hier der Code und anschließend der Fehler:
Java:
public class Uebung {

    JTextArea text;
    JTextField textfeld;
    
    public static void main(String[] args) {
        Uebung gui = new Uebung();
        gui.los();

    }

public void los() {
JFrame frame      = new JFrame();
JPanel panel        = new JPanel();
JPanel panelZwei  = new JPanel();
JButton eintragen = new JButton("eintragen");
JButton auslesen  = new JButton("auslesen");

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

eintragen.addActionListener(new MeinSpeichernListener());
auslesen.addActionListener(new MeinAuslesenListener());


textfeld = new JTextField(20);
text = new JTextArea(10,20);

panel.add(text);
panelZwei.add(textfeld);
panelZwei.add(eintragen);

frame.getContentPane().add(BorderLayout.CENTER, panel);
frame.getContentPane().add(BorderLayout.SOUTH, panelZwei);
frame.getContentPane().add(BorderLayout.WEST, auslesen);
frame.setSize(350,300);
frame.setVisible(true);

}

}


class MeinAuslesenListener implements ActionListener {
    Uebung gui =  new Uebung();
    
    public void actionPerformed(ActionEvent a) {
    gui.text.setText("Du hast es geändert");
    System.out.println("Eintrag");
    }
}

class MeinSpeichernListener implements ActionListener {
     Uebung gui =  new Uebung();
    
    public void actionPerformed(ActionEvent a) {
    gui.text.setText("Du hast eingetragen");
    System.out.println("Austrag");
    }
}

Der Fehler: Wenn ich einen Button (egal welchen) drücke, sagt der:

Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at javax.swing.AbstractButton.......

Das geht dann noch 20 Zeilen so weiter.
Meine erste Frage: Was bedeutet das genau?
Wo liegt mein Fehler?

Habe das ganze mal mit einem Button ausprobiert, mit addActionListener(this) und bin in der Uebung-Klasse geblieben. Da hat dieser eine Button funktioniert. Also iwie schaffe ich es wohl nicht, den Text richtig zu übertragen oder?

Danke für eure Hilfe 🙂 🙂
 
Klick...
lol hatte den link gerade noch in der Zwischenablage aus nem anderen Post xD

NullPointer deutet darauf hin, dass du irgendwo ein Object hast, dessen Speicherreferenz ins nichts zeigt.
Sprich der Wert der zu verwendenen Instanz ist null.
 
NullPointerException sagt, dass irgendwas null ist, also zu dem Zeitpunkt des Zugriffs (noch) nicht erstellt. Müsste in der Fehlermeldung ab erauch die Zeilenzahl stehen, wo das auftritt.

Ansonsten erstellst du sowohl in der main-Methode eine GUI, als auch in den ActionListenern die GUI (Uebung) immer wieder neu. Am besten übergibst du den ActionListenern eine Referenz davon, wenn du dort auf die GUI zugreifen willst.
 
Benutze Inner-Classes, d.h. packe deine beiden Action-Listener-Klassen in deine Klasse Uebung, so kannst du auch auf deren Textfelder etc zugreifen!

Java:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;
/**
 *
 * @author Kiri
 */
public class Uebung {
    JTextArea text;
    JTextField textfeld;
    
    public static void main(String[] args) {
        Uebung gui = new Uebung();
        gui.los();
    }
 
    public void los() {
        JFrame frame      = new JFrame();
        JPanel panel        = new JPanel();
        JPanel panelZwei  = new JPanel();
        JButton eintragen = new JButton("eintragen");
        JButton auslesen  = new JButton("auslesen");

        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

        eintragen.addActionListener(new MeinSpeichernListener());
        auslesen.addActionListener(new MeinAuslesenListener());

        textfeld = new JTextField(20);
        text = new JTextArea(10,20);

        panel.add(text);
        panelZwei.add(textfeld);
        panelZwei.add(eintragen);

        frame.getContentPane().add(BorderLayout.CENTER, panel);
        frame.getContentPane().add(BorderLayout.SOUTH, panelZwei);
        frame.getContentPane().add(BorderLayout.WEST, auslesen);
        frame.setSize(350,300);
        frame.setVisible(true);
    }
//} die schließende Klammer am Ende wieder hinzufügen
    class MeinAuslesenListener implements ActionListener {
    //    Uebung gui =  new Uebung();

        public void actionPerformed(ActionEvent a) {
//        gui.text.setText("Du hast es geändert");
        text.setText("Du hast es geändert");
        System.out.println("Eintrag");
        }
    }

    class MeinSpeichernListener implements ActionListener {
    //     Uebung gui =  new Uebung(); 

        public void actionPerformed(ActionEvent a) {
//        gui.text.setText("Du hast eingetragen");
        text.setText("Du hast eingetragen");
        System.out.println("Austrag");
        }
    }
}//hier die schließende Klammer von oben wieder hinzugeben
 
Zuletzt bearbeitet:
Hallo,

du hast fast alles richtig gemacht. Für Listener bieten sich allerdings Innere Klassen an. Also eine Klasse in einer anderen Klasse. Diese kennen sich dann, man muss also kein Objekt voneinander erzeugen um darauf zugreifen zu können.

Ich habe dein Beispiel mal entsprechend abgeändert. [WR] Haben den Klassennamen verändert[/WR]

Ansonsten habe ich nur eine eckige Klammer geändert sowie den Klassenzugriff "gui." entfernt. Aber siehe selbst und schon läuft das Programm.

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

public class Test {

	JTextArea text;
	JTextField textfeld;

	public static void main(String[] args) {
		Test gui = new Test();
		gui.los();

	}

	public void los() {
		JFrame frame = new JFrame();
		JPanel panel = new JPanel();
		JPanel panelZwei = new JPanel();
		JButton eintragen = new JButton("eintragen");
		JButton auslesen = new JButton("auslesen");

		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

		eintragen.addActionListener(new MeinSpeichernListener());
		auslesen.addActionListener(new MeinAuslesenListener());

		textfeld = new JTextField(20);
		text = new JTextArea(10, 20);

		panel.add(text);
		panelZwei.add(textfeld);
		panelZwei.add(eintragen);

		frame.getContentPane().add(BorderLayout.CENTER, panel);
		frame.getContentPane().add(BorderLayout.SOUTH, panelZwei);
		frame.getContentPane().add(BorderLayout.WEST, auslesen);
		frame.setSize(350, 300);
		frame.setVisible(true);

	}

	class MeinAuslesenListener implements ActionListener {
		

		public void actionPerformed(ActionEvent a) {
			text.setText("Du hast es geändert");
			System.out.println("Eintrag");
		}
	}

	class MeinSpeichernListener implements ActionListener {
		

		public void actionPerformed(ActionEvent a) {
			text.setText("Du hast eingetragen");
			System.out.println("Austrag");
		}
	}
}

[EDIT]Sorry, lese den Post von Kiri erst jetzt.[/EDIT]
 

Zurück
Oben