Warum macht die einfache Animation einen kleinen Fehler?

ernst

Top Contributor
Hallo allerseits,
1)
in dem einfachen Demo-Programm (siehe unten) bewegt sich ein Rechteck immer wieder von links nach rechts.
Wenn das Rechteck das 1.Mal rechts ankommt bewegt es sich wieder von links.
Aber dann befindet sich plötzlich ein kleiner roter Strich auf der linken Seite.
Warum ist das so ? (wenn man das Fenster verändert, z.B. vergrößert geht der rote Strich wieder weg).

2) Bis jetzt dachte ich, dass repaint bewirkt, dass das Bild neu gezeichnet wird.
Wenn das stimmt, warum muß dann in dem Link
http://www.java-forum.org/java-basics-anfaenger-themen/135969-anzeige-erneuern-geht.html
der alte Zeiger der Uhr mit
g.clearRect(0, 0, getWidth(), getHeight());
gelöscht werden.
Die alte Zeichnung ist doch uninteressant, da sowieso neu gezeichnet wird.

mfg
Ernst

Java:
package demoanimation10;

import java.awt.Color;
import java.awt.Container;
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.JFrame;
import javax.swing.Timer;

public class MainDemoAnimation10 {

    public static void main(String[] args) {
        AnimationView animationView = new AnimationView();
    }
}

class TimerActionListener implements ActionListener {
    private AnimationJPanel animationJPanel;
    
    public TimerActionListener(AnimationJPanel animationJPanel){
        this.animationJPanel=animationJPanel;
    }
    
    // Wird nach jedem Feuern des Timers automatisch aufgerufen
    public void actionPerformed(ActionEvent ae) {
        // Daten updaten
        int x;
        x=animationJPanel.getX();
        if(x <= 400){
            x = x + 1;
        }
        else{
            x=0;
        }
        animationJPanel.setX(x);
        // neu zeichnen
        animationJPanel.repaint();                
    }
}

class AnimationView extends javax.swing.JFrame{
   
    public AnimationView() {
	// Stelle in MyFenster deklarieren, an die Buttons, Panels, usw.
        // montiert werden.
        Container mycont;  
        // Ein Panel (Zeichenfläche), das an mycont montiert wird.
        AnimationJPanel animationJPanel;        
        // Ein Timer zum feuern.
        Timer timer;        
        // Liefert die Stelle, an die montiert wird.
        mycont = getContentPane();                
        // festlegen der Breite und Höhe des Fensters 
        this.setSize(500,500);
        animationJPanel = new AnimationJPanel();
        // Montieren des Panels (Zeichenfläche) an mycont 
        mycont.add(animationJPanel);
        // Fensterüberschrift festlegen    
	setTitle("Meine erste Animation");
        // Es wird ein Objekt eines ActionListener (besser. einer Unterklasse),
        // d.h. einer Wanze erzeugt.
        TimerActionListener tal=new TimerActionListener(animationJPanel);        
        // Dann wird ein Timer erstellt und das Objekt dieses ActionListeners 
        // dabei an diesem Timer registriert (angebracht).
        // Nach einer gewissen Zeit feuert der Timer immer wieder ein Objekt 
        // der Klasse ActionEvent ab, das automatisch der entsprechenden 
        // Methode actionPerformed(...) des ActionListeners übergeben wird.
        timer = new Timer(2,tal);
        // Dann wird dieser Timer gestartet.        
        timer.start();
        // macht das Fenster sichtbar    
        this.setVisible(true);        
        // Programm wird beendet (aus dem Arbeitsspeicher entfernt), wenn 
        // Fenster weggeklickt wird. Nachprüfen mit Task-Manager
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    }
}

class AnimationJPanel extends javax.swing.JPanel {
    // Daten für Methode paintComponent() ---
    private int x;
    private int y;

    public int getX(){
        return x;
    }
    
    public void setX(int x){
        this.x=x;
    }
    
    public int getY(){
        return y;
    }

    public void setY(int y){
        this.y=y;
    }
  
    public AnimationJPanel() {
        x=0;
        y=0;
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(x, y, 30, 25);
    }
}
 

KingOfExceptions

Bekanntes Mitglied
Bei mir ist auch kein roter Strich. Aber es kommt bei mir bei anderen Programmen auch manchmal vor, dass bei großen Bildern manchmal kurzzeitig Fehler auftreten. Das passiert vor Allem beim often und schnellen resizen von einem JFrame. Das liegt aber denke ich mal an deinem/unseren PC/PCs und der Grafikkarte, dem Prozessor oder so...
 

ernst

Top Contributor
Bei mir ist auch kein roter Strich. Aber es kommt bei mir bei anderen Programmen auch manchmal vor, dass bei großen Bildern manchmal kurzzeitig Fehler auftreten. Das passiert vor Allem beim often und schnellen resizen von einem JFrame. Das liegt aber denke ich mal an deinem/unseren PC/PCs und der Grafikkarte, dem Prozessor oder so...

Danke für eure Tests.
Aber was ist mit der 2. Frage:

2) Bis jetzt dachte ich, dass repaint bewirkt, dass das Bild neu gezeichnet wird.
Wenn das stimmt, warum muß dann in dem Link
Java programmieren aus Leidenschaft
der alte Zeiger der Uhr mit
g.clearRect(0, 0, getWidth(), getHeight());
gelöscht werden.
Die alte Zeichnung ist doch uninteressant, da sowieso neu gezeichnet wird.

mfg
Ernst
 

KingOfExceptions

Bekanntes Mitglied
Zu der 2.Frage:

In dem Thread macht der TO etwas ein bisschen anders:

Es gibt mehrere Möglichkeiten, um zu verhindern, dass die alten Komponenten bei einem repaint() noch sichtbar sind, hier mal zwei davon:
1-man benutzt
Code:
g.clearRect(...);
und überdeckt das Vorhandene mit einer (weißen) Fläche
2-man benutzt den
Code:
super
-Aufruf, d.h den Konstruktor der Superklass (
Code:
extends JPanel
)

Würde man das nicht machen, dann sähe das JFrame ein wenig komisch aus ;)
Oder bei einem sich bewegenden Quadrat, siehe Bild.
IMHO ist die 2. Möglichkeit die beste, jedoch muss man dann das 'Feature'
Code:
extends
für JPanel verwenden.
Für mehr Infos: [JAPI]http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html[/JAPI]
 

Anhänge

  • Unbenannt.jpg
    Unbenannt.jpg
    1,4 KB · Aufrufe: 42
Zuletzt bearbeitet:

ernst

Top Contributor
Zu der 2.Frage:

In dem Thread macht der TO etwas ein bisschen anders:

Es gibt mehrere Möglichkeiten, um zu verhindern, dass die alten Komponenten bei einem repaint() noch sichtbar sind, hier mal zwei davon:
1-man benutzt
Code:
g.clearRect(...);
und überdeckt das Vorhandene mit einer (weißen) Fläche
2-man benutzt den
Code:
super
-Aufruf, d.h den Konstruktor der Superklass (
Code:
extends JPanel
)

Würde man das nicht machen, dann sähe das JFrame ein wenig komisch aus ;)
Oder bei einem sich bewegenden Quadrat, siehe Bild.
IMHO ist die 2. Möglichkeit die beste, jedoch muss man dann das 'Feature'
Code:
extends
für JPanel verwenden.
Für mehr Infos: [JAPI]http://docs.oracle.com/javase/1.4.2/docs/api/java/awt/Graphics.html[/JAPI]

Danke für die Infos.

Nochmals zu meiner 1. Frage zurück.
Wenn ich im Demo-Programm unten _mehrmals_ auf den Button "schneller" drücke, wird der rote Strich links immer größer. Ist das bei euch auch der Fall ? Wenn ja, warum ?

mfg
Ernst

Java:
package wagenanimationmvc15;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

class AnimationController {
    private AnimationView animationView;
    private AnimationModel animationModel;
    
    public AnimationController(int viewlaenge, int viewbreite, int strassenlaenge, int strassenbreite) {
        animationModel = new AnimationModel(strassenlaenge, strassenbreite);        
        animationView = new AnimationView(animationModel, viewlaenge, viewbreite);
        addListener();
    }
    
    
    public AnimationView getAnimationView() {
        return animationView;
    }
    
    public void addListener(){
        B1_ActionListener b1_ActionListener;
        b1_ActionListener= new B1_ActionListener(animationModel);
        animationView.set_b1_Listener(b1_ActionListener);
        Timer timer;        
        TimerActionListener tal;
        tal=new TimerActionListener(animationModel);
        timer = new Timer(2,tal);
        timer.start();
        
    }
    

}

class TimerActionListener implements ActionListener {
    private AnimationModel animationModel;    

    public TimerActionListener(AnimationModel animationModel){
        this.animationModel=animationModel;
    }
    
    public void actionPerformed(ActionEvent ae) {
        animationModel.updatenTimer();
    }
}


class B1_ActionListener implements ActionListener {
    private AnimationModel animationModel;    

    public B1_ActionListener(AnimationModel animationModel){
        this.animationModel=animationModel;
    }
    
    public void actionPerformed(ActionEvent ae) {
        animationModel.updatenButton_B1();
    }
}

Java:
package wagenanimationmvc15;
import java.awt.Color;
import java.awt.Graphics;

class AnimationJPanel extends javax.swing.JPanel {
    // Daten für Methode paintComponent() ---
    private int x;
    private int y;

    public int getX(){
        return x;
    }
    
    public void setX(int x){
        this.x=x;
    }
    
    public int getY(){
        return y;
    }

    public void setY(int y){
        this.y=y;
    }
  
    public AnimationJPanel() {
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(x, y, 30, 25);
    }
}

Java:
package wagenanimationmvc15;

import java.util.Observable;

class AnimationModel extends Observable{
    private Wagen wagen;
    private int strassenlaenge;
    private int strassenbreite;    

    public Wagen getWagen(){
        return wagen;
    }
    
    public void updatenTimer() {
        wagen.fahren();
        setChanged();
        notifyObservers();        
    }

    public void updatenButton_B1() {
        wagen.veraendereSchritt(1);
        setChanged();
        notifyObservers();        
    }
    
    
    public AnimationModel(int strassenlaenge, int strassenbreite) {
        wagen=new Wagen(strassenlaenge, strassenbreite);
    }
}




Java:
package wagenanimationmvc15;
import java.awt.BorderLayout;
import java.awt.Container;
import java.awt.GridLayout;
import java.util.Observable;
import java.util.Observer;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;


/*
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;
    private JButton b1;    

 
    
    public AnimationView(AnimationModel animationModel, int viewlaenge, int viewbreite) {
        JPanel buttonsJPanel;
        BorderLayout borderLayout;
        GridLayout gridLayout_1_2;
        Container mycont;        
        this.animationModel = animationModel;
        // Überwachung: Es wird ein Überwacher (=Wanze, Detektiv) an
        // dem Objekt animationModell angebracht.
        this.animationModel.addObserver(this);
        // Buttons, Panels und Layouts erstellen
        b1=new JButton("schneller");
        buttonsJPanel=new JPanel();
        animationJPanel = new AnimationJPanel();        
        gridLayout_1_2=new GridLayout(1,2);
        borderLayout=new BorderLayout ();
        mycont = getContentPane();                
        // Panels mit Layout formatieren
        mycont.setLayout(borderLayout);        
        buttonsJPanel.setLayout(gridLayout_1_2);                
        // An Panels Buttons montieren
        buttonsJPanel.add(b1);
        // Dummy-Label montieren
        buttonsJPanel.add(new JLabel());                
        // An mycont die Panels montieren
        mycont.add(animationJPanel,BorderLayout.CENTER);
        mycont.add(buttonsJPanel,BorderLayout.SOUTH);        
        this.setSize(viewlaenge, viewbreite);        
        this.setVisible(true);        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    }
    
    public AnimationJPanel getAnimationJPanel(){
        return animationJPanel;
    }
    
    public void setNewView(){
        Wagen w;
        w = animationModel.getWagen();
        animationJPanel.setX(w.getOrtX());        
        animationJPanel.setY(w.getOrtY());                
    }

    // 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) {
            setNewView();
            animationJPanel.repaint();
        }
    }
    
    public void set_b1_Listener(B1_ActionListener al) {
        b1.addActionListener(al);
    }
    
    
}


Java:
package wagenanimationmvc15;
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 MainWagenAnimationMVC15 {

    public static void main(String[] args){
        AnimationController animationController = new AnimationController(500, 500, 400, 400);
    }
}


Java:
package wagenanimationmvc15;

class Wagen{
    private int ortX;
    private int ortY;
    private int schritt;
    private int strassenlaenge;
    private int strassenbreite;    

    public Wagen(int strassenlaenge, int strassenbreite){
        this.strassenlaenge=strassenlaenge;
        this.strassenbreite=strassenbreite;
        schritt = 1;
    }

    public void setOrtX(int pOrtX){
        ortX = pOrtX;
    }

    public int getOrtX(){
        return ortX;
    }

    public void setOrtY(int pOrtY){
        ortY = pOrtY;
    }

    public int getOrtY(){
        return ortY;
    }
    
    public void veraendereSchritt(int wert){
        schritt=schritt+wert;
    }
    
    void fahren(){
        if(ortX <= strassenlaenge){
            ortX = ortX + schritt;
        }
        else{
            ortX=0;
        }
    }

    void setSchritt(int pSchritt){
        schritt = pSchritt;
    }

}
 
Zuletzt bearbeitet:
S

Spacerat

Gast
Würdet ihr euch nicht gerade im Swing-API bewegen, würde ich sagen, die clearMethode sei die sicherere, weil man dann genau weis, was wann wo gecleared wird. Anders ist's wenn man dieses Clear einer Super-Implementation überlässt z.B. "super.paint()" (wobei jeder weiss, dass "super.paint()" in AWT nämlich überhaupt nichts dergleichen tut). "paintComponent()" aber ist Swing und dort auch noch die empfohlene Methode. Obwohl ich es mir kaum vorstellen kann, sieht es so aus, als ob "paintComponent()" von OS zu OS, von Version zu Version und damit im Prinzip auch von Rechner zu Rechner anders implementiert wurde. Wenn dem so ist, müsste man in Swing plötzlich beides machen; "super.paintComponent(g)" und "g.clearRect()".
 
Zuletzt bearbeitet von einem Moderator:

KingOfExceptions

Bekanntes Mitglied
@ernst:

Dann mach mal, was Spacerat gesagt hat. Benutze auch
Code:
g.clearRect(...);
zusätzlich zu
Code:
super.paintComponent(g);
. Vielleicht hilft das was. Ich versuche gleich mal, deinen Code auszuprobieren und das Problem, sollte es weiterhin bei mir zu sehen sein, zu lösen ;)
 

Michael...

Top Contributor
Wenn ich im Demo-Programm unten
Unter Demo Programm verstehe ich etwas anderes ;-) Ist wohl etwas umfangreich geworden.
Java:
class AnimationJPanel extends javax.swing.JPanel {
...
    public int getX(){
        return x;
    }
 ...
    public int getY(){
        return y;
    }
...
Witzbold!! Du überschreibst hier zwei wichtige Methoden von JComponent! Kein Wunder, dass der LayoutManager da Problem bekommt und Dir "graphische" Rückstände angezeigt werden.

Allgemein würde ich mir über den Klassenaufbau nochmal nachdenken. Auch die Variablenbezeichner sind nicht immer hilfreich.
 

ernst

Top Contributor
Unter Demo Programm verstehe ich etwas anderes ;-) Ist wohl etwas umfangreich geworden.

Witzbold!! Du überschreibst hier zwei wichtige Methoden von JComponent! Kein Wunder, dass der LayoutManager da Problem bekommt und Dir "graphische" Rückstände angezeigt werden.

Allgemein würde ich mir über den Klassenaufbau nochmal nachdenken. Auch die Variablenbezeichner sind nicht immer hilfreich.
1)
Aaah, stimmt !! Das war der Fehler !!
Danke!

2)
>
>Allgemein würde ich mir über den Klassenaufbau nochmal nachdenken.
>
Was kann man besser machen?



>
>Auch die Variablenbezeichner sind nicht immer hilfreich.
>
Das denke ich auch. Was kann man besser machen. Hast du einen Vorschlag?
 

KingOfExceptions

Bekanntes Mitglied
3) -b1 als Buttonnamen ist nicht super
-tal als TimerActionListener nicht so toll
-b1_ActionListener oder wie das war... auch nicht so toll. Wenn in den ActionListener nicht viel reinmuss, dann kannst du das auch so machen:
Java:
JButton button=new JButton();
button.addActionListener(new ActionListener()
{
       public void actionPerformed(Event evt)
       {
        //HIER SOLLTE NICHT SO VIEL REIN
       }
});
 

Michael...

Top Contributor
z.B. sollten Methodennamen auch etwas darüber aussagen was sie machen z.B. updatenTimer() und updatenButton_B1() im Model hören sich eher danach an, als ob ein Timer oder ein Button aktualisiert werden soll, aber hier geht es ja darum das sich der Wagen bewegt bzw. die Geschwindkeit erhöht wird. moveCar() oder increaseSpeed() wären hier wohl passender. Es macht ja keinen Sinn im Methodenamen zu verpacken wer diese aufruft. (Abgesehen davon, dass man das im Voraus sowieso nicht weiß) Eventuell soll die Methode ja auch mal von einem Button B2 oder einer Taste XY oder von allen aufgerufen werden.

Auch hast Du wohl auch ein bisschen die Trennung von View und Model übertrieben, so dass Du die Positionsdaten doppelt hälst (ortX, ortY in Wagen und x,y in AnimationPanel) die Daten sollten von Model gehalten und verwaltet werden, die View wertet diese nur aus und agiert dementsprechend.
 

ernst

Top Contributor
z.B. sollten Methodennamen auch etwas darüber aussagen was sie machen z.B. updatenTimer() und updatenButton_B1() im Model hören sich eher danach an, als ob ein Timer oder ein Button aktualisiert werden soll, aber hier geht es ja darum das sich der Wagen bewegt bzw. die Geschwindkeit erhöht wird. moveCar() oder increaseSpeed() wären hier wohl passender. Es macht ja keinen Sinn im Methodenamen zu verpacken wer diese aufruft. (Abgesehen davon, dass man das im Voraus sowieso nicht weiß) Eventuell soll die Methode ja auch mal von einem Button B2 oder einer Taste XY oder von allen aufgerufen werden.

Auch hast Du wohl auch ein bisschen die Trennung von View und Model übertrieben, so dass Du die Positionsdaten doppelt hälst (ortX, ortY in Wagen und x,y in AnimationPanel) die Daten sollten von Model gehalten und verwaltet werden, die View wertet diese nur aus und agiert dementsprechend.

1) Um besser durchzublicken, habe ich die Namensgebung bei den Objekten die "feuern" bis jetzt so gemacht, daß ich weiß welche der feuernden Objekte die Methode aufruft.

2) Um nicht "die Positionsdaten doppelt zu halten", habe ich - wegen euer Kritik - begonnen das Programm abzuändern.
Allerdings bekomme ich laufend eine NullpointerException.
Ich habe jetzt schon länger daran rumgemacht und weiß nicht woher diese kommt.
Außerdem wird mein Button erst dann angezeigt, wenn die Fenstergröße durch den Anwender verändert wird.
Deshalb bringe ich unten die geänderte Version.
Weiß jemand, wo sich mein Fehler befindet ?

mfg
Ernst


Java:
package wagenanimationmvc15;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import javax.swing.Timer;

class AnimationController {
    private AnimationView animationView;
    private AnimationModel animationModel;
    
    public AnimationController(int viewlaenge, int viewbreite, int strassenlaenge, int strassenbreite) {
        animationModel = new AnimationModel(strassenlaenge, strassenbreite);        
        animationView = new AnimationView(animationModel, viewlaenge, viewbreite);
        addListener();
    }
    
    public void addListener(){
        // Button + Wanze
        ButtonSchnellerActionListener buttonSchnellerActionListener;
        buttonSchnellerActionListener= new ButtonSchnellerActionListener(animationModel);
        animationView.setButtonSchnellerListener(buttonSchnellerActionListener);
        // Timer + Wanze
        Timer timer;        
        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.updateFromTimerTimer();
    }
}


class ButtonSchnellerActionListener implements ActionListener {
    private AnimationModel animationModel;    

    public ButtonSchnellerActionListener(AnimationModel animationModel){
        this.animationModel=animationModel;
    }
    
    public void actionPerformed(ActionEvent ae) {
        animationModel.updateFromButtonSchneller();
    }
}

Java:
package wagenanimationmvc15;
import java.awt.Color;
import java.awt.Graphics;

class AnimationJPanel extends javax.swing.JPanel {
    // Daten für Methode paintComponent() ---
    private Wagen wagen;
    
    public void setWagen(Wagen wagen){
        this.wagen=wagen;
    }

    
    
    public AnimationJPanel() {
    }
    
    public void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(Color.red);
        g.fillRect(wagen.getOrtX(), wagen.getOrtY(), 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 wagenanimationmvc15;

import java.util.Observable;

class AnimationModel extends Observable{
    private Wagen wagen;
    private int strassenlaenge;
    private int strassenbreite;    

    public Wagen getWagen(){
        return wagen;
    }
    
    public void updateFromTimerTimer() {
        wagen.fahren();
        setChanged();
        notifyObservers();        
    }

    public void updateFromButtonSchneller() {
        wagen.veraendereSchritt(1);
        setChanged();
        notifyObservers();        
    }
    
    
    public AnimationModel(int strassenlaenge, int strassenbreite) {
        wagen=new Wagen(strassenlaenge, strassenbreite);
    }
}

Java:
Label;
import javax.swing.JPanel;


/*
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;
    private JButton buttonSchneller;    

 
    
    public AnimationView(AnimationModel animationModel, int viewlaenge, int viewbreite) {
        JPanel buttonsJPanel;
        BorderLayout borderLayout;
        GridLayout gridLayout_1_2;
        Container mycont;        
        this.animationModel = animationModel;
        // Überwachung: Es wird ein Überwacher (=Wanze, Detektiv) an
        // dem Objekt animationModell angebracht.
        this.animationModel.addObserver(this);
        // Buttons, Panels und Layouts erstellen
        buttonSchneller=new JButton("schneller");
        buttonsJPanel=new JPanel();
        animationJPanel = new AnimationJPanel();        
        gridLayout_1_2=new GridLayout(1,2);
        borderLayout=new BorderLayout ();
        mycont = getContentPane();                
        // Panels mit Layout formatieren
        mycont.setLayout(borderLayout);        
        buttonsJPanel.setLayout(gridLayout_1_2);                
        // An Panels Buttons montieren
        buttonsJPanel.add(buttonSchneller);
        // Dummy-Label montieren
        buttonsJPanel.add(new JLabel());                
        // An mycont die Panels montieren
        mycont.add(animationJPanel,BorderLayout.CENTER);
        mycont.add(buttonsJPanel,BorderLayout.SOUTH);        
        this.setSize(viewlaenge, viewbreite);        
        this.setVisible(true);        
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);        
    }
    
    public AnimationJPanel getAnimationJPanel(){
        return animationJPanel;
    }

    /*    
    public void setNewView(){
        Wagen w;
        w = animationModel.getWagen();
        //animationJPanel.setX(w.getOrtX());        
        //animationJPanel.setY(w.getOrtY());                
    }
*/
    
    // 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) {
        Wagen w;
        w = animationModel.getWagen();
            //setNewView();
            animationJPanel.setWagen(w);
            animationJPanel.repaint();
        }
    }
    
    public void setButtonSchnellerListener(ButtonSchnellerActionListener al) {
        buttonSchneller.addActionListener(al);
    }
}

Java:
/*
R O G R A M M B E S C H R E I B U N G
Zusätzlich wird noch ein Button einegfügt, mit dem man einen neunen 
Wagen erstellen kann.


*/

package wagenanimationmvc15;
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 MainWagenAnimationMVC15 {

    public static void main(String[] args){
        AnimationController animationController = new AnimationController(500, 500, 400, 400);
    }
}

Java:
package wagenanimationmvc15;

class Wagen{
    private int ortX;
    private int ortY;
    private int schritt;
    private int strassenlaenge;
    private int strassenbreite;    

    public Wagen(int strassenlaenge, int strassenbreite){
        ortX=0;
        ortY=0;
        schritt = 1;        
        this.strassenlaenge=strassenlaenge;
        this.strassenbreite=strassenbreite;

    }

    public void setOrtX(int pOrtX){
        ortX = pOrtX;
    }

    public int getOrtX(){
        return ortX;
    }

    public void setOrtY(int pOrtY){
        ortY = pOrtY;
    }

    public int getOrtY(){
        return ortY;
    }
    
    public void veraendereSchritt(int wert){
        schritt=schritt+wert;
    }
    
    void fahren(){
        if(ortX <= strassenlaenge){
            ortX = ortX + schritt;
        }
        else{
            ortX=0;
        }
    }

    void setSchritt(int pSchritt){
        schritt = pSchritt;
    }

}
 
Zuletzt bearbeitet:
Ähnliche Java Themen
  Titel Forum Antworten Datum
H GridBagLayout macht mich wahnsinnig :-( AWT, Swing, JavaFX & SWT 5
melaniemueller Was macht e.getSource() ? AWT, Swing, JavaFX & SWT 2
N Java Mouse Listiner macht alles zusammen AWT, Swing, JavaFX & SWT 4
J JavaFX Löschen im Tabelview macht Problem AWT, Swing, JavaFX & SWT 15
ruutaiokwu Swing windowStateChanged macht exakt das Gegenteil beim Verändern der Fenstergrösse AWT, Swing, JavaFX & SWT 3
B Swing label.setText() macht probleme AWT, Swing, JavaFX & SWT 5
K 2D-Grafik .GIF macht mir Probleme AWT, Swing, JavaFX & SWT 14
H GridBagLayout macht Probleme... AWT, Swing, JavaFX & SWT 4
Furtano AWT GridBagLayout macht mir Sorgen AWT, Swing, JavaFX & SWT 3
C Swing Was macht die Methode "setDataProviderCreditShown(boolean b)" AWT, Swing, JavaFX & SWT 4
T JLabel macht sich selbstständig? o.0 AWT, Swing, JavaFX & SWT 2
L LayoutManager macht nichts AWT, Swing, JavaFX & SWT 19
S Swing Swing macht sehr seltsame Zeichnungen. AWT, Swing, JavaFX & SWT 13
danx066 MouseListener macht was er will AWT, Swing, JavaFX & SWT 14
G Swing Button ActionListener macht komische Sachen AWT, Swing, JavaFX & SWT 19
P Swing Skalieren mit DrawImage macht Linien kaputt AWT, Swing, JavaFX & SWT 6
O Swing JButton werden richtig gewechselt aber die Maus macht die alten wieder Sichtbar?? AWT, Swing, JavaFX & SWT 5
R wie macht am besten ein GUI ? AWT, Swing, JavaFX & SWT 21
hdi Swing JFrame#setCursor macht Zicken AWT, Swing, JavaFX & SWT 10
L Swing JButton macht Eventhandling kaputt AWT, Swing, JavaFX & SWT 3
D GridBagLayout macht nicht das was es soll AWT, Swing, JavaFX & SWT 12
J Swing Formulare in Swing - wie macht ihr das? AWT, Swing, JavaFX & SWT 7
T JTable / RowSorter macht große Probleme AWT, Swing, JavaFX & SWT 2
V Swing Mein swingender Pokertisch macht Probleme AWT, Swing, JavaFX & SWT 10
G Bildervorschau macht Probleme AWT, Swing, JavaFX & SWT 22
N SWT Text pack() macht Text zu klein AWT, Swing, JavaFX & SWT 2
hdi Swing EDT macht kein repaint() AWT, Swing, JavaFX & SWT 2
N Gridlayout macht Probleme AWT, Swing, JavaFX & SWT 3
G jpanel macht kein repaint AWT, Swing, JavaFX & SWT 2
F Thread macht keine Pause AWT, Swing, JavaFX & SWT 22
W Wie macht man in Swing eigentlich nen Benutzereingabedialog? AWT, Swing, JavaFX & SWT 7
T JTree macht mich wahnsinnig (selektion) AWT, Swing, JavaFX & SWT 2
hdi meine paint-methode macht faxen? AWT, Swing, JavaFX & SWT 21
W Wie macht man so nen Settings Dialog AWT, Swing, JavaFX & SWT 2
P JTree macht mich fertig AWT, Swing, JavaFX & SWT 3
E Hilfe - setVisible macht was es will AWT, Swing, JavaFX & SWT 7
F Paint-Methode Überschreiben macht Refresh-Fehler ? AWT, Swing, JavaFX & SWT 8
G KeyListener Problem in GUI (macht einfach nichts) AWT, Swing, JavaFX & SWT 2
M JComboBox macht nicht immer was sie soll AWT, Swing, JavaFX & SWT 5
F JTable mit Checkbox macht Probleme AWT, Swing, JavaFX & SWT 4
F Look and Feel zur Laufzeit ändern macht Probleme AWT, Swing, JavaFX & SWT 3
A Was macht super? AWT, Swing, JavaFX & SWT 10
C Was genau macht getValueIsAdjusting() ? AWT, Swing, JavaFX & SWT 4
Jose05 einfache GUI mit schwarzem Feld AWT, Swing, JavaFX & SWT 12
X JavaFX Einfache FX Application, aber wie alte Features umgehen? AWT, Swing, JavaFX & SWT 10
B AWT einfache Stoppuhr -Verbesserungsvorschläge AWT, Swing, JavaFX & SWT 2
A Einfache Benutzeroberfläche wie realisieren? AWT, Swing, JavaFX & SWT 6
P Swing Einfache Eingabe in JTextfield wird nicht ausgegeben AWT, Swing, JavaFX & SWT 3
E EINFACHE Verständnisfrage zu repaint(), paintComponent(), usw. AWT, Swing, JavaFX & SWT 16
E einfache Frage:warum ist Hintergrund grau ? AWT, Swing, JavaFX & SWT 24
E einfache Frage zu paintComponent und Graphics AWT, Swing, JavaFX & SWT 7
L Einfache Layout Frage für Applet -> Was mache ich bloss falsch? AWT, Swing, JavaFX & SWT 2
V Swing Einfache Graphen-Lib? AWT, Swing, JavaFX & SWT 2
A Swing einfache fragen zu frame AWT, Swing, JavaFX & SWT 10
iLoveTheInternet Einfache Grafikausgabe AWT, Swing, JavaFX & SWT 2
E Swing Einfache Frage zu JMenu AWT, Swing, JavaFX & SWT 4
E Einfache Frage zu GridBagLayout AWT, Swing, JavaFX & SWT 30
E einfache Frage zu invokeLater() AWT, Swing, JavaFX & SWT 4
B Einfache jpg-Bilder anzeigen AWT, Swing, JavaFX & SWT 8
E Einfache Frage zu GridLayout AWT, Swing, JavaFX & SWT 35
H einfache Buttonanzeige AWT, Swing, JavaFX & SWT 2
M Einfache Möglichkeit einen Login Dialog zu bauen? AWT, Swing, JavaFX & SWT 1
M einfache Frage über SWT GUI-Programmierung AWT, Swing, JavaFX & SWT 3
S Einfache Thread-Frage AWT, Swing, JavaFX & SWT 3
G Einfache Text formatierung? Wie? AWT, Swing, JavaFX & SWT 4
O Suche einfache Möglichkeit zum Speichern AWT, Swing, JavaFX & SWT 21
G Einfache Frage Panel AWT, Swing, JavaFX & SWT 5
P Animation läuft nicht korrekt AWT, Swing, JavaFX & SWT 8
Ernesto95 JavaFX Return Value nach Beendigung einer Animation AWT, Swing, JavaFX & SWT 15
H Simple Animation mit Swing AWT, Swing, JavaFX & SWT 2
DeBoiJoshua 2D-Grafik Gif Animation will nicht laden AWT, Swing, JavaFX & SWT 1
S JavaFX WebView zeigt keine Animation AWT, Swing, JavaFX & SWT 5
E showAndWait is not allowed during animation or layout processing Memory FX AWT, Swing, JavaFX & SWT 2
A 2D-Grafik Ruckelfreie Animation AWT, Swing, JavaFX & SWT 20
L JavaFX Animation, erst zeichnen dann anzeigen AWT, Swing, JavaFX & SWT 4
L JavaFX Animation für Panel wechsel AWT, Swing, JavaFX & SWT 3
J Java FX Koordinaten NACH Animation setzen, wie? AWT, Swing, JavaFX & SWT 9
Pr0m3theus Animation nach Event AWT, Swing, JavaFX & SWT 6
F JavaFX Timeline Animation soll X- und Y-Position während Animation ändern AWT, Swing, JavaFX & SWT 2
javampir 2D-Grafik Effizienz bei animation AWT, Swing, JavaFX & SWT 0
C Pixel-Rendering/Animation Performance in BufferedImage AWT, Swing, JavaFX & SWT 1
wolfgang63 JavaFX Animation, Kreise im vorgegebem Takt durchs Fenster laufen lassen AWT, Swing, JavaFX & SWT 3
P Ansatz für 2D Animation gesucht AWT, Swing, JavaFX & SWT 2
Thallius HHübsche Kopier Animation? AWT, Swing, JavaFX & SWT 5
L JPanel kleine "Animation" AWT, Swing, JavaFX & SWT 7
E Animation läuft nicht mehr flüssig AWT, Swing, JavaFX & SWT 8
B 2D-Grafik Dynamisches Erstellen von Images und deren Animation AWT, Swing, JavaFX & SWT 4
R Swing Komponenten bleiben bei Animation unsichtbar AWT, Swing, JavaFX & SWT 7
J GIF Animation AWT, Swing, JavaFX & SWT 2
B Swing Thread+Animation AWT, Swing, JavaFX & SWT 7
R Swing Animation mit JLayeredPane? AWT, Swing, JavaFX & SWT 8
K 3D-Grafik Animation AWT, Swing, JavaFX & SWT 4
U Gif Animation mit JLabel AWT, Swing, JavaFX & SWT 3
P KeyListener + Animation AWT, Swing, JavaFX & SWT 2
D 2D-Grafik Animation flackert AWT, Swing, JavaFX & SWT 8
R Polygon-Animation mit Darstellungsfehlern AWT, Swing, JavaFX & SWT 5
StupidAttack Animation, JComponent AWT, Swing, JavaFX & SWT 3
S SWT Rudimentäre Bild Animation AWT, Swing, JavaFX & SWT 3
C Animation auf einem JPanel AWT, Swing, JavaFX & SWT 3
A paintComponent() - Animation AWT, Swing, JavaFX & SWT 2

Ähnliche Java Themen

Neue Themen


Oben