Hallo allerseits,
Ich habe da ein Problem; ich kriege eine befremdliche Fehlermeldung (s. u.) :
Der Hintergrund ist der : Ich habe eine Applikation mit einer Animation/ Simulation (auf jeden Fall was Bewegtes) geschrieben
Diese Animation baut, wie man im Code oben sieht, eine GUI ein und schickt ihr die Instanz eines Interface's von sich selbst. Das dient dazu, die Informationen des ActionListeners in die "falsche" Richtung, von der GUI zur Simulation, in der sie referenziert ist, weiterzugeben.
Das Interface :
und die GUI :
Beim Start erscheint Graphik (Animation + GUI) als stehendes Bild, wie geplant (laufe = false). Die Animation soll nun durch Drücken der Starttaste in Bewegung gebracht werden. Ich bekomme stattdessen die o. a. Fehlermeldung, und der Thread läuft weiter.
Von den o. g. System.out.println-Anweisungen erscheint nach Programmstart
Bei erneutem Drücken des Buttons kommt die Fehlermeldung noch einmal und der Thread läuft weiter.
Die boolsche Variable "laufe", um die es ja geht, bleibt immer "false", so dass die Animation nicht in bewegung kommt. Die " public void setLaufen(boolean lauf)"-Methode der Animation wird offensichtlich nicht aufgerufen, zumindest erscheint keine der beiden System.out..-Meldungen.
Seltsam ist : Wenn ich die Zeile aus der GUI
Ich habe da ein Problem; ich kriege eine befremdliche Fehlermeldung (s. u.) :
Der Hintergrund ist der : Ich habe eine Applikation mit einer Animation/ Simulation (auf jeden Fall was Bewegtes) geschrieben
Code:
public class LifeSimulation extends JPanel implements Runnable, MouseListener, LifeStartStop
{
LifeGui gui;
boolean laufe = false;
Thread running;
....
public LifeSimulation()
{
gui = new LifeGui();
gui.setInterface((LifeStartStop) this);
...
anfangen();
}
public void anfangen()
{
brettLeer();
brettZufall();
repaint();
laufe = false;
starten();
}
public void run()
{ while(true)
{verzoegerung();
System.out.println("Run 1 "+laufe);
while(laufe)
{ System.out.println("Run 2"+laufe);
zaehlen();
wachsen();
repaint();
verzoegerung();
}}
}
public void starten()
{ if (running == null)
{ running = new Thread(this);
running.start();
} }
public void stop()
{running=null;}
public void setLaufen(boolean lauf)
{
System.out.println("vorher "+laufe);
laufe = lauf;
System.out.println("nachher "+laufe);
}}
....
Das Interface :
Code:
public interface LifeStartStop
{
public void brettLeer();
public void setLaufen(boolean lauf);
}
und die GUI :
Code:
public class LifeGui extends JPanel
{
LifeStartStop parent;
JButton bStart;
public LifeGui()
{
setKomponenten();
...
}
public void setInterface(LifeStartStop simulation)
{
parent = simulation;
System.out.println("setInterface");
}
public void setKomponenten()
{
bStart = new JButton(" S T A R T ");
bStart.addActionListener
(new ActionListener()
{ public void actionPerformed(ActionEvent e)
{ System.out.println("Start vorher");
parent.setLaufen(true);
System.out.println("Start nachher");
....
}});
}}
Von den o. g. System.out.println-Anweisungen erscheint nach Programmstart
Man beachte die "Start vorher"-Meldung in der Mitte der Fehlermeldung.setInterface
Run 1 false
Run 1 false
Run 1 false
...
[Button wird gedrückt :]
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at de.kanitrino.life.LifeGui$1.actionPerformed(LifeGui.java:114)
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)
Start vorher
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$500(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$JavaSecurityAccessImpl.doIntersectionPrivilege(Unknown Source)
at java.security.ProtectionDomain$JavaSecurityAccessImpl.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$JavaSecurityAccessImpl.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)
Run 1 false
Run 1 false
...
Bei erneutem Drücken des Buttons kommt die Fehlermeldung noch einmal und der Thread läuft weiter.
Die boolsche Variable "laufe", um die es ja geht, bleibt immer "false", so dass die Animation nicht in bewegung kommt. Die " public void setLaufen(boolean lauf)"-Methode der Animation wird offensichtlich nicht aufgerufen, zumindest erscheint keine der beiden System.out..-Meldungen.
Seltsam ist : Wenn ich die Zeile aus der GUI
außerhalb des ActionListeners - z. B. im Konstruktor - platziere, erhalte ich, ohne einen anderen System.out.. -Text die Fehlermeldungparent.setLaufen(true);
Hat jemand eine Idee, worin das Problem bestehen kann ?Exception in thread "main" java.lang.NullPointerException
at de.kanitrino.life.LifeGui.<init>(LifeGui.java:57)
at de.kanitrino.life.LifeSimulation.<init>(LifeSimulation.java:43)
at de.kanitrino.life.LifeMain.<init>(LifeMain.java:29)
at de.kanitrino.life.LifeMain.main(LifeMain.java:49)