Hallo nochmal,
ich habe ein Problem mit meinem Observer, und zwar:
wie im HandBuch von Java (Guido Krüger) beschrieben, habe ich mir einen Observer programmiert.
In der 1. Klasse unten wird die Methode fireUpdate(..) von der Klasse 2 aufgerufen, in der Klasse 2 ruft die Methode fireUpdate - observers.update(this, index, Wert, iArr); auf, welche sich (die Methode update) in der 3. Klasse befindet.
Das ganze wird gestartet von der 3. Klasse ganz unten, durch den Aufruf z.B. von
if (getActionCommand().equals("Taster1"))
{
datenSpeicher.setArrayEintrag(1,4); /* Wert, Index */
}
Mein Problem ist jetzt, dass, wenn ich auf "Taster1" drücke und ich möchte die Farbe dieses Taste (Taster1) verändern (in Klasse 3) dann funktionierts, aber wenn ich auf "Schalter1" oder "Schalter2" drücke umd die hintergrundFarbe von Taster1 zu ändern, dann bekomme ich folgende NullpointerException: -> ich weiß aber nicht wieso, ich weiß nur, dass der Fehler in der dritten Klasse liegt.
der Sinn darin ist: ich möchte testen, wenn ich in der Klasse 1 die Methode setArrayEintrag(..) aufrufe, sollen sich die Hintergrundfarben der Buttons je nach Wert ändern.
Vielleicht könnte mir da jemand helfen -> ich wäre Euch sehr dankbar !!!
Danke
lg
PS: ich kann das ganze Projekt auch gerne schicken.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at net.jank.ppos.component.JankButton.access$000(JankButton.java:14)
at net.jank.ppos.component.JankButton$1.update(JankButton.java:106)
at net.jank.ppos.datastore.Subject.fireUpdate(Subject.java:35)
at net.jank.ppos.datastore.DatenSpeicher.setArrayEintrag(DatenSpeicher.java:37)
at net.jank.ppos.component.JankButton.actionPerformed(JankButton.java:132)
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:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
ich habe ein Problem mit meinem Observer, und zwar:
wie im HandBuch von Java (Guido Krüger) beschrieben, habe ich mir einen Observer programmiert.
In der 1. Klasse unten wird die Methode fireUpdate(..) von der Klasse 2 aufgerufen, in der Klasse 2 ruft die Methode fireUpdate - observers.update(this, index, Wert, iArr); auf, welche sich (die Methode update) in der 3. Klasse befindet.
Das ganze wird gestartet von der 3. Klasse ganz unten, durch den Aufruf z.B. von
if (getActionCommand().equals("Taster1"))
{
datenSpeicher.setArrayEintrag(1,4); /* Wert, Index */
}
Mein Problem ist jetzt, dass, wenn ich auf "Taster1" drücke und ich möchte die Farbe dieses Taste (Taster1) verändern (in Klasse 3) dann funktionierts, aber wenn ich auf "Schalter1" oder "Schalter2" drücke umd die hintergrundFarbe von Taster1 zu ändern, dann bekomme ich folgende NullpointerException: -> ich weiß aber nicht wieso, ich weiß nur, dass der Fehler in der dritten Klasse liegt.
der Sinn darin ist: ich möchte testen, wenn ich in der Klasse 1 die Methode setArrayEintrag(..) aufrufe, sollen sich die Hintergrundfarben der Buttons je nach Wert ändern.
Vielleicht könnte mir da jemand helfen -> ich wäre Euch sehr dankbar !!!
Danke
lg
PS: ich kann das ganze Projekt auch gerne schicken.
Exception in thread "AWT-EventQueue-0" java.lang.NullPointerException
at net.jank.ppos.component.JankButton.access$000(JankButton.java:14)
at net.jank.ppos.component.JankButton$1.update(JankButton.java:106)
at net.jank.ppos.datastore.Subject.fireUpdate(Subject.java:35)
at net.jank.ppos.datastore.DatenSpeicher.setArrayEintrag(DatenSpeicher.java:37)
at net.jank.ppos.component.JankButton.actionPerformed(JankButton.java:132)
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:6038)
at javax.swing.JComponent.processMouseEvent(JComponent.java:3260)
at java.awt.Component.processEvent(Component.java:5803)
at java.awt.Container.processEvent(Container.java:2058)
at java.awt.Component.dispatchEventImpl(Component.java:4410)
at java.awt.Container.dispatchEventImpl(Container.java:2116)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.LightweightDispatcher.retargetMouseEvent(Container.java:4322)
at java.awt.LightweightDispatcher.processMouseEvent(Container.java:3986)
at java.awt.LightweightDispatcher.dispatchEvent(Container.java:3916)
at java.awt.Container.dispatchEventImpl(Container.java:2102)
at java.awt.Window.dispatchEventImpl(Window.java:2429)
at java.awt.Component.dispatchEvent(Component.java:4240)
at java.awt.EventQueue.dispatchEvent(EventQueue.java:599)
at java.awt.EventDispatchThread.pumpOneEventForFilters(EventDispatchThread.java:273)
at java.awt.EventDispatchThread.pumpEventsForFilter(EventDispatchThread.java:183)
at java.awt.EventDispatchThread.pumpEventsForHierarchy(EventDispatchThread.java:173)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:168)
at java.awt.EventDispatchThread.pumpEvents(EventDispatchThread.java:160)
at java.awt.EventDispatchThread.run(EventDispatchThread.java:121)
Code:
in Klasse 1
public class DatenSpeicher {
public static int[] iArr = new int[100];
Subject datenSpeicher = new Subject();
int cnt = 0;
public DatenSpeicher() {}
public void attach(Observer observer)
{
datenSpeicher.attach(observer);
}
public void detach(Observer observer)
{
datenSpeicher.detach(observer);
}
/* wenn sich in dieser Klasse etwas tut dann datenSpeicher.fireUpdate() aufrufen */
public void setArrayEintrag(int Wert, int index)
{
System.out.println("DatenSpeicher: index: " + index + ", Wert: " + Wert);
this.iArr[index] = Wert;
datenSpeicher.fireUpdate(index, Wert, iArr);
}
}
Klasse 2
public interface Observer
{
public void update(Subject subject, int index, int Wert, int[] iArr);
}
public class Subject
{
Observer[] observers = new Observer[5];
int observerCnt = 0;
public void attach(Observer observer) // einen DatenSpeicherMethoden registrieren
{
observers[observerCnt++] = observer;
}
public void detach(Observer observer) // einen DatenSpeicherMethoden deregistrieren
{
for (int i = 0; i < observerCnt; i++)
{
if (observers[i] == observer)
{
--observerCnt;
for (;i < observerCnt; i++)
{
observers[i] = observers[i+1];
}
break;
}
}
}
public void fireUpdate(int index, int Wert, int[] iArr)
{
System.out.println("Ich bin in Subjekt");
for (int i = 0; i < observerCnt; i++)
{
observers[i].update(this, index, Wert, iArr);
}
}
}
in Klasse 3 ist im Konstruktor folgendes Implementiert:
datenSpeicher.attach(new Observer(){
public void update(Subject subject, int index, int Wert, int[] iArr)
{
System.out.println("Index: " + index + ", Wert: " + Wert);
switch (index) {
case 3: for (int i = 0; i < iArrMoeglWerteInt.length-1; i++) {
if (Wert == buttons.get("Taster1").iArrMoeglWerteInt[i])
buttons.get("Taster1").setBackground(colorMap.get(buttons.get("Taster1").iArrFarbeZuWerte[i]));
} break;
case 4: for (int i = 0; i < iArrMoeglWerteInt.length-1; i++) {
if (Wert == buttons.get("Schalter1").iArrMoeglWerteInt[i])
buttons.get("Schalter1").setBackground(colorMap.get(buttons.get("Taster1").iArrFarbeZuWerte[i]));
break;
}
case 5: for (int i = 0; i < iArrMoeglWerteInt.length-1; i++) {
if (Wert == buttons.get("Schalter2").iArrMoeglWerteInt[i])
buttons.get("Schalter2").setBackground(colorMap.get(buttons.get("Schalter2").iArrFarbeZuWerte[i]));
} break;
default:
}
}
});
und auch in dieser Klasse:
public void actionPerformed(ActionEvent event)
{
if (getActionCommand().equals("Taster1")) {
datenSpeicher.setArrayEintrag(1,4); /* Wert, Index */
}
if (getActionCommand().equals("Schalter1")) {
System.out.println(buttons.get("Schalter1").getBackground());
datenSpeicher.setArrayEintrag(1,4);
}
if (getActionCommand().equals("Schalter2")) {
System.out.println(buttons.get("Schalter2").getBackground());
datenSpeicher.setArrayEintrag(1,4);
}
}