Hallo allerseits,
Im Java-Programm unten gibt es Probleme, wenn ich in der Klasse AnimationView in der Methode
update() die Methode animationJPanel.setWagen(w) aufrufe.
Dann gibt es eine NullpointerException.
Wenn ich diese Anweisung weglasse und in den Konstruktor schreibe funktioniert alles.
Weiß jemand, warum dies so ist und warum erst während des Laufzeit diese NullpointerException kommt?
mfg
Ernst
Im Java-Programm unten gibt es Probleme, wenn ich in der Klasse AnimationView in der Methode
update() die Methode animationJPanel.setWagen(w) aufrufe.
Dann gibt es eine NullpointerException.
Wenn ich diese Anweisung weglasse und in den Konstruktor schreibe funktioniert alles.
Weiß jemand, warum dies so ist und warum erst während des Laufzeit diese NullpointerException kommt?
Java:
public void update(Observable m, Object o) {
if (m == animationModel) {
/*
FRAGE:
Warum gibt es eine NullpointerException, wenn wenn man nicht im
Konstruktor, sondern hier den Wagen im animationJPanel setzt?
*/
/*
Wagen w;
w = animationModel.getWagen();
animationJPanel.setWagen(w);
*/
animationJPanel.repaint();
}
}
mfg
Ernst
Java:
package wagenanimationmvc10;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;
class AnimationController {
private AnimationView animationView;
private AnimationModel animationModel;
public AnimationController() {
Timer timer;
animationModel = new AnimationModel();
animationView = new AnimationView(animationModel);
TimerActionListener tal;
tal=new TimerActionListener(animationModel);
timer = new Timer(2,tal);
timer.start();
}
public AnimationView getAnimationView() {
return animationView;
}
}
class TimerActionListener implements ActionListener {
private AnimationModel animationModel;
public TimerActionListener(AnimationModel animationModel){
this.animationModel=animationModel;
}
public void actionPerformed(ActionEvent ae) {
animationModel.updaten();
}
}
Java:
package wagenanimationmvc10;
import java.awt.Color;
import java.awt.Graphics;
class AnimationJPanel extends javax.swing.JPanel {
private Wagen wagen;
public void setWagen(Wagen wagen){
this.wagen=wagen;
}
// Daten für Methode paintComponent() ---
private int x;
private int y;
public int getKoordinateX(){
return x;
}
public void setKoordinateX(int x){
this.x=x;
}
public int getKoordinateY(){
return y;
}
public void setKoordinateY(int y){
this.y=y;
}
public AnimationJPanel() {
}
public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.red);
g.fillRect(wagen.getX(), wagen.getY(), 30, 25);
}
}
Java:
/*
AnimationModel wird überwacht, deswegen muß es von der Klasse Observable
erben. Durch die Anweisungen:
setChanged();
notifyObservers();
in einer Methode f(), wirft eine überwachte Klasse ein spezielles
Objekt, das von der Methode update einer überwachenden Klasse
eingefangen wird.
*/
package wagenanimationmvc10;
import java.util.Observable;
class AnimationModel extends Observable{
private Wagen wagen;
public Wagen getWagen(){
return wagen;
}
public void updaten() {
wagen.fahren();
setChanged();
notifyObservers();
}
public AnimationModel() {
wagen=new Wagen();
}
}
Java:
package wagenanimationmvc10;
import java.awt.Container;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JFrame;
/*
AnimationView ist eine überwachende Klasse. Deswegen muß sie die
Schnittstelle Observer implementieren und unbedingt die Methode
update() ausprogrammieren.
update() wird immer dann aufgerufen, wenn sich in einer überwachten
Klasse etwas ändert (dies muß durch die Anweisungen setchanged()
und notifyObservers() vorbereitet werden).
*/
class AnimationView extends javax.swing.JFrame implements Observer{
private AnimationJPanel animationJPanel;
private AnimationModel animationModel;
public AnimationView(AnimationModel animationModel) {
Container mycont;
this.animationModel = animationModel;
// Überwachung: Es wird ein Überwacher (=Wanze, Detektiv) an
// dem Objekt animationModell angebracht.
this.animationModel.addObserver(this);
mycont = getContentPane();
this.setSize(500,500);
animationJPanel = new AnimationJPanel();
mycont.add(animationJPanel);
this.setVisible(true);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
animationJPanel.setWagen(animationModel.getWagen());
}
public AnimationJPanel getAnimationJPanel(){
return animationJPanel;
}
// Wenn sich im überwachten Modell Daten aändern, wird ein Event
// ausgelöst (ein spezielles Objekt geworfen) das von der Methde
// update() eingefangen wird. Diese Methode wird dann also aufgerufen
public void update(Observable m, Object o) {
if (m == animationModel) {
/*
FRAGE:
Warum gibt es eine NullpointerException, wenn wenn man nicht im
Konstruktor, sondern hier den Wagen im animationJPanel setzt?
*/
/*
Wagen w;
w = animationModel.getWagen();
animationJPanel.setWagen(w);
*/
animationJPanel.repaint();
}
}
}
Java:
/*
R O G R A M M B E S C H R E I B U N G
Dies ist ein Demo-Programm für MVC (Animation)
I) Informationsfluß
+-- CONTROLER --+
| |
v v
VIEW --------> MODEL
Die Pfeile bedeuten Assoziationen.
Nicht eingezeichnet sind die Events (in entgegengesetzter Richtung)
von (siehe Wikipedia)
VIEW --> CONTROLER
MODEL --> VIEW
II)
Ein Wagen fährt immer wieder (ohne Einwirkung eines Anwenders)
von links nach rechts
Ein Timer wirft immer wieder in regelmäßigen Zeitintervallen ein
Objekt (ActionEvent), das mit der Methode actionPerformed() im Controler
eingefangen wird.
-->
Mit der Methode updaten() in Model werden die Daten (Koordinaten) des
Autos verändert.
-->
Das Model benachrichtigt die View über die Observer-Technik, daß Daten
verändert wurden.
-->
Die View zeichnet das Auto neu und gibt es auf dem Bildschirm aus.
*/
package wagenanimationmvc10;
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.Observable;
import java.util.Observer;
import javax.swing.*;
public class MainWagenAnimationMVC10 {
public static void main(String[] args){
AnimationController animationController = new AnimationController();
}
}
Java:
package wagenanimationmvc10;
class Wagen{
private int x;
private int y;
private int schritt;
public Wagen(){
x=0;
y=0;
schritt = 1;
}
public void setX(int pX){
x = pX;
}
public int getX(){
return x;
}
public void setY(int pY){
y = pY;
}
public int getY(){
return y;
}
void fahren(){
if(x <= 400){
x = x + schritt;
}
else{
x=0;
}
}
void setSchritt(int pSchritt){
schritt = pSchritt;
}
}