PDA

Archiv verlassen und diese Seite im Standarddesign anzeigen : [java] Frage zu ActionListener


Gast
2006-11-21, 23:37:39
Also ich hab ein JPanel mit einem JButton und einer JTextField, der JButton ist beim ActionListener registriert. Wird der Button gedrückt, soll das Textfeld ausgelesen werden.
In public void actionPerformed les ich das Textfeld aud und speicher den Inhalt in einem String, das geht problemlos.
So jetzt mein Problem, ich möchte nun eine Methode in einer anderen Klasse aufrufen und ihr den String übergeben, nur geht das nicht, da kommt nur:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at simulation.Dialog1.actionPerformed(Dialog1.java:49)
at javax.swing.AbstractButton.fireActionPerformed(Unknown Source)
at javax.swing.AbstractButton$Handler.actionPerformed(Unknown Source)
und so weiter ;)

Hat weiss jemand wieso?

thx

Matrix316
2006-11-21, 23:52:45
Vielleicht mal grob den Quelltext (Auszüge)?

Gast
2006-11-22, 00:00:29
ja hier:

public class Dialog1 extends JFrame implements ActionListener {

JTextField comminput;

/** Creates a new instance of Dialog1 */
public Dialog1() {
super("Command Input");
addWindowListener(new WindowAdapter() {
public void windowClosing(WindowEvent e) {
dispose();
}
});

Container cont = getContentPane();
JPanel panel = new JPanel();
panel.setLayout(new FlowLayout());
comminput = new JTextField((UserInterface.lastcommand + UserInterface.lastparameter),20);
panel.add(comminput, BorderLayout.NORTH);
JButton ack = new JButton("Ok");
ack.addActionListener(this);
panel.add(ack, BorderLayout.SOUTH);
cont.add(panel);

}

//@Override
public void actionPerformed(ActionEvent event) {
CheckerImplement.ui.interp(comminput.getText());

Monger
2006-11-22, 08:17:27
Ich sehe nicht, dass du irgendwo das Textfeld instanziiert hättest. Deshalb produziert jeder Zugriff darauf auch eine NullPointerException...


Nur so mal als Tipp für die Zukunft: Schau dir mal das Keyword "final" genauer an, und zwar in Bezug auf Attribute und Variablen.

Gast
2006-11-22, 11:31:45
Doch instanzier ich schon
comminput = new JTextField((UserInterface.lastcommand + UserInterface.lastparameter),20);

darauf zugreifen kann ich ja, und auch in einen string speichern.
also String txt = comminput.getText() funktioniert problemlos.

Das Problem ist, dass wenn ich eine Methode aufrufe, die in einer anderen Klasse ist, ich eben einen Haufen Exceptions bekomme.
Also hier: AndereKlasse.Objekt.Methode(txt);

Monger
2006-11-22, 11:54:38
Schreib doch bitte nochmal die vollständige Fehlermeldung. Da kann man ja sehen, wer genau die Exception wirft.

Gast
2006-11-22, 12:01:44
Das hier kommt:
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at simulation.Dialog1.actionPerformed(Dialog1.java:52)
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.dispatchEvent(Unknown Source)
at java.awt.EventDispatchThread.pumpOneEventForHierarchy(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)

Ausgeben kann ich den String auch problemlos, nur auf keine Objektmethode in einer anderen klasse zugreifen.

Matrix316
2006-11-22, 12:31:29
Funktionieren denn andere Methoden der anderen Klasse oder gibts nur bei der Stringübergabe den Fehler? Und wenn du einen String selbst
String txt = comminput.getText()
also "txt"und nicht den aufruf "comminput.getText()" aus dem Feld übergibst?

Gast
2006-11-22, 12:53:39
Die Methoden der anderen Klasse funktionieren und werden auch in anderen Klassen verwendet. Auch wenn ich einen selbst definierten String übergebe kommt die Exception.

Die Exception wird nur dann ausgeköst wenn ich versuche von der Klasse Dialog1 auf eine andere Klasse zugreifen, nur sehe ich nicht wieso, da die Fehlermeldung imo ja nichts damit zu tun hat.

Gast
2006-11-22, 13:22:51
Ok hat sich erledigt, hab einen akzeptablen workaround gefunden.
thx für die hilfe

Gast
2006-11-25, 06:48:12
ist das Swing oder AWT? Weil in der Fehlermeldung kommt ja irgendwie beides vor...

RMC
2006-11-25, 10:55:13
Sry dass ich den Thread "mißbrauche" aber genau zum Thema ActionListener hab ich auch eine Frage:

Kann man denn einen ActionListener selber für irgendeine Klasse implementieren, sodass dieser dann ausgelöst wird wenn zb mousePressed() des MouseListeners ausgeführt wird? Im Prinzip geht das ja wenn die eigene Klasse von AbstractButton ableitet, dass man einfach die "addActionListener()" Methode ausführen kann. Diesen Schritt will ich jetz aber mal außen vor lassen und soszuagen was "eigenes" implementiern.

also etwas, dass ich dann ungefähr das bekannte Konstrukt verwenden kann:


MyButton button = new MyButton();

button.addActionListener(new ActionListener()
{
//usw
});



Oder einfacher für mich wäre zb, dass man einen "Funktionspointer" mitgibt der dann im Falle der mousePressed() Funtion ausgelöst wird. Ich weiß nicht ob man sowas in der Art irgendwie in Java umsetzen kann, zB


MyButton button = new MyButton(myFunction);

public void myFunction()
{
//do something
}



Im Prinzip gehts mir darum, einem eigenen Button (der weder von JButton noch von AbstractButton ableitet) von Außen irgendwie eine Funktion oder ein Stück Code mitzuteilen, dass bei seiner Aktivierung ausgeführt werden soll.

SavageX
2006-11-25, 12:12:35
ist das Swing oder AWT? Weil in der Fehlermeldung kommt ja irgendwie beides vor...

Swing baut auf AWT auf. Zumindest benutzt es einen guten Teil des Event-Handlings etc.

Gast
2006-11-25, 12:42:00
Kann man denn einen ActionListener selber für irgendeine Klasse implementieren, sodass dieser dann ausgelöst wird wenn zb mousePressed() des MouseListeners ausgeführt wird?

ich versteh dich nicht ganz. ActionListener ist ja ein interface wird also sowieso erst später in deiner klasse implementiert.

Monger
2006-11-25, 13:36:15
Im Prinzip gehts mir darum, einem eigenen Button (der weder von JButton noch von AbstractButton ableitet) von Außen irgendwie eine Funktion oder ein Stück Code mitzuteilen, dass bei seiner Aktivierung ausgeführt werden soll.

Keine Ahnung ob ich dich jetzt richtig verstehe, aber willst du einen eigenen Button kreieren, und suchst jetzt eine Möglichkeit wie du die Listener benachrichtigen kannst. Nun, das ist simpel:


private List<ActionListener> listeners;

/* Das hier ist der große Knackpunkt. Wie man von der Grafik zum Aufruf dieser Methode kommt, weiß ich leider auch nicht.*/
public void click(){
for(ActionListener listener : listeners){
listener.actionPerformed(new ActionEvent());
}
}


Natürlich brauchst du dann noch eine Methode damit sich Listener an diesem Objekt registrieren können, und dein Event sollte ein bißchen aussagekräftiger sein...

Aber mehr steckt hinter diesem Event-Listener Pattern eigentlich nicht dahinter.

RMC
2006-11-25, 14:06:13
Keine Ahnung ob ich dich jetzt richtig verstehe, aber willst du einen eigenen Button kreieren, und suchst jetzt eine Möglichkeit wie du die Listener benachrichtigen kannst

Ja genau. Ich hab schon in der AbstractButton Klasse nachgeschaut wie das gelöst wurde (mit listenerList etc.), bin aber dann irgendwann stecken geblieben weil es dann mit zu viel anderem Code in Verbindung stand.

Im Moment habe ich das hier:


class MyButton extends JComponent implements MouseListener, MouseMotionListener
{
public void mouseClicked()
{
//Aktion durchführen
}
}


diese Aktion steht aber direkt im Button...jetzt muss aber die Aktion natürlich von Außen definierbar sein. Aber wie genau das geht...kA

Matrix316
2006-11-25, 14:59:53
Ist nicht "addActionListener genau dafür da?:rolleyes:

Monger
2006-11-25, 16:36:49
diese Aktion steht aber direkt im Button...jetzt muss aber die Aktion natürlich von Außen definierbar sein. Aber wie genau das geht...kA

Jetzt musst du doch nur noch mein Beispiel mit deinem Code zusammenführen, und dann hast du es doch schon! ;)

Sobald die Maus geklickt wurde, schickst du an alle Listener ein Event ab. Was danach geschieht, ist Aufgabe der Listener.

RMC
2006-11-25, 16:55:05
habs...



protected void fireActionPerformed(ActionEvent event)
{
Object[] listeners = listenerList.getListenerList();
for (int i = listeners.length - 1; i >= 0; i --)
{
if (listeners[i] instanceof ActionListener)
{
((ActionListener) listeners[i]).actionPerformed(event);
}
}
}

public void addActionListener(ActionListener l)
{
listenerList.add(ActionListener.class, l);
}

public void mouseClicked(MouseEvent e)
{
ActionEvent e1 = new ActionEvent(GUIClickButton.this,
ActionEvent.ACTION_PERFORMED,"");
this.fireActionPerformed(e1);
}



War unkomplizierter als gedacht..hab vermutet, dass ich auch das ButtonModel involvieren muss damit das funktioniert.

Monger
2006-11-25, 17:56:18
Erm... tut denn die Sache mit InstanceOf wirklich not? :|

Ich sehe keinen Grund, weshalb du in einer Liste von Listenern jeden Listener darauf prüfen musst, dass er wirklich ein Listener ist...

RMC
2006-11-25, 18:42:58
Erm... tut denn die Sache mit InstanceOf wirklich not? :|

Ich sehe keinen Grund, weshalb du in einer Liste von Listenern jeden Listener darauf prüfen musst, dass er wirklich ein Listener ist...

Nein tut nicht not, nur wenn ich mehrere Listener habe (zb ChangeListener, usw.)