Erste Schritte Kreis animieren

Pio

Mitglied
Hallo zusammen,

ich möchte einen Kreis animieren, der immer größer wird. Soweit läuft auch alles wie es soll. Da ich aber sehr unerfahren bin, wollte ich mir eine kurze Rückmeldung von erfahrenen Usern einhohlen. Könnte man was verbessern, oder ist was falsch gelaufen? Kritik gern mit kurzer Erklärung, damit man es sich anlesen kann. Bei Fragen, fragen! Danke!

Jetzt zur Erklärung, wie ich es mir gedacht habe:
Ich habe für die Position des Kreises Klassenvariablen benutzt (Int x und y), da ich sonst nicht die Position des Kreises in der Klasse kreis aufrufen kann. In kreisGui wird die Fenstergröße gesetzt und die Position des Kreises ermittelt (Var. X und y).

Für die Veränderungen habe ich die Klasse kreis erstellt. Im Konstruktor setzte ich den Timer, breite und hoehe für den Kreis (Größe des Kreises) und starte den Timer. Der Timer startet den TimerListener, der als erstes die Methode kreisAendern() aufruft. Hier werden die Variablen x, y, breite und hoehe geändert.

Durch die if-Verzweigung kontrolliere ich den Stop des Timers. Dies kontrolliere ich durch die Variable zaehler. Wenn diese Variable 150 (das sind die Durchgänge, wie oft der Kreis neu gezeichnet wird) erreicht hat, wird der timer gestopt.

Code:
import java.awt.Graphics;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.Timer;

public class kreisGui extends JFrame

{
    /**
     *
     */
    private static final long serialVersionUID = 1L;
   
    int x, y;

    public kreisGui(String titel)
    {
        super(titel);
       
        add(new kreis());
       
        setSize(400, 400);
       
        x = (getSize().width / 2) - 5;
        y = (getSize().height / 2) - 5;
       
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        setVisible(true);
    }
   
    public class kreis extends JPanel
    {
        /**
         *
         */
        private static final long serialVersionUID = 1L;
       
        int breite, hoehe;
        Timer timer;
        int zaehler;
       
       
        //die überschriebene Methode paintComponent()
        @Override
        protected void paintComponent(Graphics g)
       
        {
            //die Methode der übergeordnete Klasse aufrufen
            super.paintComponent(g);
           
            g.drawOval(x, y, breite, hoehe);
           
        }
       
        public kreis()
        {
           
            timer = new Timer(20, new TimerListener());
                       
            breite = 10;
            hoehe = 10;
           
            zaehler = 0;

            timer.start();
        }
       
        public void kreisAendern()
        {
           
            x = x -1;
            y = y - 1;
           
            breite = breite +2;
            hoehe  = hoehe + 2;
           
            if(zaehler == 150)
            {
                timer.stop();
            }
            System.out.println("X Y " + x + " " + y + " || " + breite + " " + hoehe + " zaehler " + zaehler);
            zaehler++;
        }

        class TimerListener implements ActionListener
        {

            @Override
            public void actionPerformed(ActionEvent e)
            {
                kreisAendern();
                repaint();
            }
           
        }
    }
}
 
Grundsätzlich spricht mMn. nichts gegen deinen Weg.

3 Dinge, die ich dir mitgeben möchte:

- Gewöhn dir ab von JFrame zu erben wenn du es nicht brauchst. Du musst immer nur dann von einer Klasse erben, wenn du deren Funktionalität erweitern willst. In deinem Fall reicht es aber ein Objekt von JFrame zu erstellen und darüber dein Fenster aufzubauen. Wie du sicherlich weißt kann man nur von einer Klasse erben weshalb du dir gut überlegen solltest von welcher Klasse du erbst 🙂

- Java-Konvention "schreiben es vor", dass Klassenanmen in UpperCammelCase und der Rest in lowerCammelCase geschrieben werden. Wenn man sich an die Konventionen hält ist es einfacher für andere Programmierer dein Code zu lesen - es ist aber natürlich kein Muss 🙂

- Ich bin kein Freund von inneren Klasse da es die Sache mMn unübersichtlicher macht. Ich weiß aber das es - auch in diesem Forum - Leute gibt die mir da widersprechen weshalb ich die Sache jetzt nicht weiter ankreiden werde. Es ist sicherlich Geschmackssache. Es gibt natürlich auch Stellen wo innere Klassen die Sache vereinfachen 🙂

Gruß Robert
 
Hallo Robert,

dank dir für deine Antwort. Ich habe einiges nachgelesen und mir zu Herzen genommen. Insbesondere dein erster Hinweis, den ich auch (aus meiner Sicht) erfolgreich umsetzen konnte. Die Java-Konventionen sind mir bekannt und von mir vernachlässigt (nicht mit Absicht) worden. Aber auch das habe ich korrigiert. Zu den inneren Klassen: Ich selbst habe es so angelernt / beigebracht bekommen. Ob sinnvoll ist ..... wie du schon sagst -> ist Geschmackssache. Für ein Urteil hab ich, als blutiger Anfänger, zu wenig Erfahrung.
 

Zurück
Oben