# Java JTextArea und ActionListener Probleme



## javapete (26. Mrz 2009)

Guten abend, 
bräuchte dringend eine kleine Anfängerunterstützung, da der in eine extra Klasse "outgesourcte" ActionListener einfach nicht tut, was er tun soll. Er soll einfach das erste String Feld des Arrays in die JTextArea schreiben, sobald der Benutzer den Button drückt. Ich bekomme beim Ausführen folgenden Codes: 

[HIGHLIGHT="Java"]import java.awt.event.*;
import java.awt.*;
import javax.swing.*;

public class SinnGUI {

public SinnGUI() {

initGUI();
}


public void initGUI() {

ActionBeobachter1 beobachter = new ActionBeobachter1();

JFrame sinnframe = new JFrame ();
 //Fenstererzeugung
 sinnframe.setSize (800,500);
 sinnframe.setLocation (200,100);
 // Comonentenerzeugung

 JLabel sinnlabel = new JLabel (" Merkprogramm");
 JTextArea sinntext = new JTextArea (10,20);
 JButton weiter = new JButton ("weiter");
 weiter.setActionCommand ("nächstes Zitat");

 JPanel sinn1 = new JPanel ();
 sinn1.setBackground(Color.ORANGE);
 sinn1.add(sinnlabel);
 JPanel sinn2 = new JPanel ();
 sinn2.setBackground(Color.ORANGE);
 sinn2.add (sinntext);

 sinnframe.getContentPane().add(BorderLayout.NORTH,sinn1);
 sinnframe.getContentPane().add(BorderLayout.CENTER, sinn2);
 sinnframe.getContentPane().add(BorderLayout.SOUTH, weiter);

 weiter.addActionListener (beobachter);


 sinnframe.setVisible (true);

}
public static void main(String args[])
    {
        SwingUtilities.invokeLater(new Runnable()
        {
            public void run()
            {
                new SinnGUI();
            }
        });
    }
}[/HIGHLIGHT]

[HIGHLIGHT="Java"]import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class ActionBeobachter1 implements ActionListener {
 JTextArea sinntext;


    public void actionPerformed(ActionEvent e){
     String [] sinnArray;   // Deklaration des Arrays
 sinnArray = new String [20];   // Initialisierung des Arrays

 sinnArray [0] = "Ein Tag am Meer ist ein Tag am Meer";
 sinnArray [1] = "Der Sinn des Lebens ist der Unsinn selbst, Guru Pitka" ;


sinntext.setText( "sinnArray [0] ");
}
    }[/HIGHLIGHT]

folgenden Fehler des Java-Editor-Compilers angezeigt:


```
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
 at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
  at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```

Ich möchte den ActionListener aber nicht als innere Klasse implementieren, denn das habe ich schon hinbekommen.  Würde mich riesig über Eure Hilfe freuen, denn ich versuche schon seit einiger Zeit das Problem alleine zu lösen, bisher erfolglos.
;(


----------



## Schandro (26. Mrz 2009)

Der großteil der Fehlermeldung fehlt, außerdem ist das keine Compiler Fehlermeldung sondern ein Exception Stack Trace während des ausführens...

Was soll den dieser Code-Teil INNERHALB der actionPerformed-Methode?

     [highlight=Java]String [] sinnArray;   // Deklaration des Arrays
 sinnArray = new String [20];   // Initialisierung des Arrays

 sinnArray [0] = "Ein Tag am Meer ist ein Tag am Meer";
 sinnArray [1] = "Der Sinn des Lebens ist der Unsinn selbst, Guru Pitka" ;


sinntext.setText( "sinnArray [0] ");[/highlight]

1. Wird in "sinntext" immer der String  "sinnArray [0] " reingeschrieben, wegen den " " drumherum.
2. Wird bei jeden Buttondrücken ein komplett neues 20-er Array erzeugt was danach wieder weggeworfen wird. Es hat zurzeit auch keinen nutzen innerhalb der Methode


Deinem Post fehlen übrigens die Code-Tags um den Code


----------



## javapete (27. Mrz 2009)

Vielen Dank Schandro ! Die " " hab ich versehentlich gesetzt.
Aber das ist ja nicht der wesentliche Fehler. Den Array habe ich in der actionPerformed-Methode initialisiert, damit er der Methode bekannt ist. Wie hätte ich das eleganter lösen können ? Was hat die Fehlermeldung (diesmal komplett) zu bedeuten ? Wie kann ich das Problem beheben ?  In der Literatur finden sich meist Beispiele bei denen der ActionListener in einer inneren Klasse realisiert wurde. Das möchte ich allerdings nicht.  Kann es sein, dass der Methode mein JTextArea sinntext nicht bekannt ist ? Findet jemand eine Lösung meines Problems ? 


```
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ActionBeobachter1.actionPerformed(ActionBeobachter1.java:18)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6216)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5981)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4583)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
    at ActionBeobachter1.actionPerformed(ActionBeobachter1.java:18)
    at javax.swing.AbstractButton.fireActionPerformed(AbstractButton.java:1995)
    at javax.swing.AbstractButton$Handler.actionPerformed(AbstractButton.java:2318)
    at javax.swing.DefaultButtonModel.fireActionPerformed(DefaultButtonModel.java:387)
    at javax.swing.DefaultButtonModel.setPressed(DefaultButtonModel.java:242)
    at javax.swing.plaf.basic.BasicButtonListener.mouseReleased(BasicButtonListener.java:236)
    at java.awt.Component.processMouseEvent(Component.java:6216)
    at javax.swing.JComponent.processMouseEvent(JComponent.java:3265)
    at java.awt.Component.processEvent(Component.java:5981)
    at java.awt.Container.processEvent(Container.java:2041)
    at java.awt.Component.dispatchEventImpl(Component.java:4583)
    at java.awt.Container.dispatchEventImpl(Container.java:2099)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4556)
    at java.awt.LightweightDispatcher.processMouseEvent(Container.java:4220)
    at java.awt.LightweightDispatcher.dispatchEvent(Container.java:4150)
    at java.awt.Container.dispatchEventImpl(Container.java:2085)
    at java.awt.Window.dispatchEventImpl(Window.java:2475)
    at java.awt.Component.dispatchEvent(Component.java:4413)
    at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
    at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:269)
    at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:184)
    at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:174)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:169)
    at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:161)
    at java.awt.EventDispatchThread.run(EventDispatchThread.java:122)
```


----------



## Ebenius (27. Mrz 2009)

:autsch:
"sinntext" im ActionListener ist null. Das wird ja auch nirgends gesetzt.
der Text den Du setzen willst muss String sein. Kein String-Array. Wenn Du das mehrzeilig möchtest, dann geht das so: [Highlight=Java]sinntext.setText("1. Zeile\n2. Zeile");[/Highlight]

So in etwa könnte's gehen: [Highlight=Java]import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.*;

public class ActionBeobachter1 implements ActionListener {

  JTextArea sinntext;

  /** Creates a new {@code ActionBeobachter1}. */
  public ActionBeobachter1(JTextArea sinntext) {
    this.sinntext = sinntext;
  }

  public void actionPerformed(ActionEvent e) {
    final String text =
          "Ein Tag am Meer ist ein Tag am Meer"
                + "\nDer Sinn des Lebens ist der Unsinn selbst, Guru Pitka";
    sinntext.setText(text);
  }
}[/Highlight]
:rtfm: Bei Dir ist dringend ein Java-Anfängerbuch nötig; Deine Fragen haben nix mit GUI / Swing / AWT zu tun, sondern sind einfache Probleme mit der Java-Sprache. Buchempfehlungen findest Du im Forum en masse.

Allgemein noch ein paar Anmerkungen: 
Bitte den Code vernünftig formatieren; sowohl in Deinem Java-Editor als auch hier im Forum. Siehe auch [thread=80991]BBCode - Textauszeichnung im Forum[/thread]
Die Klasse "ActionBeobachter1" muss doch nicht so heißen? Warum eine "1" im Namen?
Hab das Thema zu den Anfängerfragen verschoben

Ebenius


----------



## javapete (27. Mrz 2009)

Vielen Dank für die Hilfe.  Gut jetzt weiß ich, dass die Klasse ActionBeobachter erst durch einen Konstruktor, welcher  das JTextArea-Objekt sinntext übergibt, Zugriff auf sinntext habe. Leider habe ich noch Probleme bei der Registrierung des ActionListeners in der Klasse SinnGUI. 

Habe mit 

ActionBeobachter beobachter = new ActionBeobachter();

ein Objekt der Klasse ActionBeobachter erzeugt. Dieses Objekt habe ich dann 
dem JButton weiter übergeben.
weiter.addActionListener (beobachter);
Bekomme aber folgende Fehlermeldung: 


SinnGUI.java:16:31: cannot find symbol
symbol  : constructor ActionBeobachter()
location: class ActionBeobachter
ActionBeobachter beobachter = new ActionBeobachter();
                              ^
1 error


Habe auch versucht ohne Objekterzeugung, d.h über eine direkte Referenz zur Klasse, den ActionListener zu registrieren.

weiter.addActionListener(new ActionBeobacher () );

Auch vergeblich. Bestimmt habe ich ein wichtiges Detail vergessen. Wäre Euch sehr dankbar, wenn Ihr mir  noch ein bisschen auf die Sprünge helft. Suche vergleichbares vergeblich in der Lektüre :rtfm:.  Falls Ihr mir nur indirekt weiterhelfen möchtet, könnt Ihr mir ja ein Buch empfehlen, in dem die Sichtbarkeit der Objekte und deren gegenseitige Kommunikation ausführlich behandelt wird. Das wäre auch schon sehr hilfreich. :toll:


----------



## mvitz (27. Mrz 2009)

weil du die JTextArea dem ActionListener übergeben musst im Konstruktor
[HIGHLIGHT="Java"]ActionBeaobachter beaobachter = new ActionBeobachter(sinnText);[/HIGHLIGHT]

Aber wie Ebenius schon sagte, dir fehlen da noch die einen oder anderen Java Grundlagen.


----------



## javapete (27. Mrz 2009)

vielen Dank habi55 !  Jetzt funktioniert es :applaus:
Gibt es gute Literatur über das  Arbeiten mit Objekten über verschwiedene Klassen hinweg ? Ist ja sehr fundamental und wichtig.


----------

