Animation starten und rücksetzen

F

flow

Hallo zusammen!

Ich wollte einen Kreis programmieren, welcher mit einem Button erscheint und sich animiert vergrößert, und mit einem anderem Button verschwindet und wieder "klein" macht.
Das Problem dabei: Der Kreis vergrößert sich nur wenn man das Fenster größer macht und das zurücksetzen der größe funktioniert auch nicht richtig.


Java:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.Ellipse2D;
import java.awt.event.*;

public class AnimationWindow extends JFrame implements ActionListener {
    public AnimationWindow()
    {
       this.pack();
       this.setLocationByPlatform( true );
       this.setVisible( true );
       this.setSize(300,100);
       JButton Button1 = new JButton("start");
       JButton Button2 = new JButton("hide");
       
       this.setLayout(new BorderLayout());

       this.add(Button1, BorderLayout.LINE_START);
       this.add(Button2, BorderLayout.LINE_END);
      Button1.addActionListener(this);
     
    }
    public void actionPerformed(ActionEvent event) {
        Animation ani = new Animation();
        this.add(ani, BorderLayout.CENTER);
        ani.Fill();
    }
     public static void main( String[] args ){
      AnimationWindow test = new AnimationWindow(); 
    }
}
  class Animation extends JPanel implements ActionListener 
{
  private Ellipse2D.Float ellipse = new Ellipse2D.Float();
  private double esize = 0;
  private double mSize = 40;
  private Timer timer;

  public void step() {
    esize++;
    if (esize < mSize) {
      ellipse.setFrame(ellipse.getX(), ellipse.getY(), esize, esize);
    } else {
      timer.stop();
    }
  }
 public void Fill() {
    timer = new Timer(20, this);
    timer.start();
    }
    
  public void render(Graphics2D g2) {
    g2.setColor(Color.black);
    g2.fill(ellipse);
  }
  public void paint(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2.setRenderingHints(rh); 
    step();
    render(g2);
  }

  public void actionPerformed(ActionEvent e) {
    repaint();
  }
}
Bin um jede Hilfe dankbar!

flow
 
Zuletzt bearbeitet von einem Moderator:
Hallo, zunächst einmal, ein Paar kleine Hinweise, die vermutlich nichts mti deinem Problem zu tun haben...

1.
Starte dein Programme ein Paar mal und schau dann in einen Taskmanager unter Prozesse - damit wirst du nicht froh ;)
Abhilfe bringt folgende Zeile:
Java:
this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

2.
und das zurücksetzen der größe funktioniert auch nicht richtig.
Hast du das schon programmiert?

3.
Je öfter du auf deinen ersten Button klickst, umso mehr Panel wirst du haben.


Edit:
Ich habe mir erlaubt alles einmal ein wenig umzubauen, allerdings kann ich dir nicht sagen, woran es bei dir genau lag *Schande auf mein Haupt* So funktioniert es jedenfalls.
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.Ellipse2D;
import java.awt.event.*;

public class AnimationWindow extends JFrame implements ActionListener {
	public static final long serialVersionUID = 1L;
	
	JButton button1 = new JButton("start");
    JButton button2 = new JButton("hide");
    Animation ani = new Animation();
	
    public AnimationWindow()
    {
    	pack();
        setLocationByPlatform( true );
        setVisible( true );
        setSize(300,100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
        setLayout(new BorderLayout());

        add(button1, BorderLayout.LINE_START);
        add(button2, BorderLayout.LINE_END);
        add(ani, BorderLayout.CENTER);
       
        button1.addActionListener(this); 
    }
    public void actionPerformed(ActionEvent event) {
        ani.fill();
    }
    public static void main( String[] args ){
      new AnimationWindow(); 
    }
}
  class Animation extends JPanel implements ActionListener {
	  public static final long serialVersionUID = 1L;
	  
	  private Ellipse2D.Float ellipse = new Ellipse2D.Float();
	  private double esize = 0;
	  private double mSize = 40;
	  private Timer timer;
	  
	  public void fill() {
	    timer = new Timer(20, this);
	    timer.start();
	  }
	    
	  public void paint(Graphics g) {
	    super.paintComponent(g);
	    Graphics2D g2 = (Graphics2D) g;
	    RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
	    rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
	    g2.setRenderingHints(rh);
	    g2.setColor(Color.black);
	    g2.fill(ellipse);
	  }
	
	  public void actionPerformed(ActionEvent e) {
			esize++;
			if (esize < mSize) {
				ellipse.setFrame(ellipse.getX(), ellipse.getY(), esize, esize);
				repaint();
			} 
			else {
				timer.stop();
			}
	  	}
	}
 
Zuletzt bearbeitet:
Ja, im eigentlichen Programm war das natürlich enthalten ;)
Hab das lediglich rausgekürzt... trotzdem danke für den Hinweis!

Korrigierte Form:

Java:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.Ellipse2D;
import java.awt.event.*;
 
public class AnimationWindow extends JFrame implements ActionListener {
    public AnimationWindow()
    {
       this.pack();
       this.setLocationByPlatform( true );
       this.setVisible( true );
       this.setSize(300,100);
       this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
       JButton Button1 = new JButton("start");
       JButton Button2 = new JButton("hide");
       
       this.setLayout(new BorderLayout());
 
       this.add(Button1, BorderLayout.LINE_START);
       this.add(Button2, BorderLayout.LINE_END);
      Button1.addActionListener(this);
     
    }
    public void actionPerformed(ActionEvent event) {
        Animation ani = new Animation();
        this.add(ani, BorderLayout.CENTER);
        ani.Fill();
    }
     public static void main( String[] args ){
      AnimationWindow test = new AnimationWindow();
    }
}
  class Animation extends JPanel implements ActionListener
{
  private Ellipse2D.Float ellipse = new Ellipse2D.Float();
  private double esize = 0;
  private double mSize = 40;
  private Timer timer;
 
  public void step() {
    esize++;
    if (esize < mSize) {
      ellipse.setFrame(ellipse.getX(), ellipse.getY(), esize, esize);
    } else {
      timer.stop();
    }
  }
 public void Fill() {
    timer = new Timer(20, this);
    timer.start();
    }
   
  public void render(Graphics2D g2) {
    g2.setColor(Color.black);
    g2.fill(ellipse);
  }
  public void paint(Graphics g) {
    super.paintComponent(g);
    Graphics2D g2 = (Graphics2D) g;
    RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
    rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
    g2.setRenderingHints(rh);
    step();
    render(g2);
  }
 
  public void actionPerformed(ActionEvent e) {
    repaint();
  }
}

Kann leider nichts editieren (sollte mich mal registreiren ;) )

Funktioniert jetzt so weit:
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.Ellipse2D;
import java.awt.event.*;
 
public class AnimationWindow extends JFrame implements ActionListener {
    public static final long serialVersionUID = 1L;
   
    JButton button1 = new JButton("start");
    JButton button2 = new JButton("hide");
    Animation ani = new Animation();
   
    public AnimationWindow()
    {
        pack();
        setLocationByPlatform( true );
        setVisible( true );
        setSize(300,100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
        setLayout(new BorderLayout());
 
        add(button1, BorderLayout.LINE_START);
        add(button2, BorderLayout.LINE_END);
        add(ani, BorderLayout.CENTER);
        
        button1.setActionCommand("1");
        button2.setActionCommand("2");
        
        button1.addActionListener(this);
        button2.addActionListener(this);
    }
    public void actionPerformed(ActionEvent event) {
        switch(Integer.parseInt(event.getActionCommand())) {
        case 1: ani.fill(); break;
        case 2: ani.hide(); break;
    }
    }
    public static void main( String[] args ){
      new AnimationWindow();
    }
}
  class Animation extends JPanel implements ActionListener {
      public static final long serialVersionUID = 1L;
     
      private Ellipse2D.Float ellipse = new Ellipse2D.Float();
      private double esize = 0;
      private double mSize = 40;
      private Timer timer;
     
      public void fill() {
        timer = new Timer(20, this);
        timer.start();
      }
      public void hide() {
        ellipse.setFrame(ellipse.getX(), ellipse.getY(), 0, 0);
        repaint();
        }
      public void paint(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHints(rh);
        g2.setColor(Color.black);
        g2.fill(ellipse);
      }
   
      public void actionPerformed(ActionEvent e) {
            esize++;
            if (esize < mSize) {
                ellipse.setFrame(ellipse.getX(), ellipse.getY(), esize, esize);
                repaint();
            }
            else {
                timer.stop();
            }
        }
    }

Funktioniert jedoch leider bloß beim ersten Mal, was muss ich ändern dass das immer geht?
 
Zuletzt bearbeitet von einem Moderator:
oh *blush*

jetzt funktionierts:
Java:
import java.awt.*;
import javax.swing.*;
import java.awt.geom.Ellipse2D;
import java.awt.event.*;
 
public class AnimationWindow extends JFrame implements ActionListener {
    public static final long serialVersionUID = 1L;
   
    JButton button1 = new JButton("start");
    JButton button2 = new JButton("hide");
    Animation ani = new Animation();
   
    public AnimationWindow()
    {
        pack();
        setLocationByPlatform( true );
        setVisible( true );
        setSize(300,100);
        setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
   
        setLayout(new BorderLayout());
 
        add(button1, BorderLayout.LINE_START);
        add(button2, BorderLayout.LINE_END);
        add(ani, BorderLayout.CENTER);
        
        button1.setActionCommand("1");
        button2.setActionCommand("2");
        
        button1.addActionListener(this);
        button2.addActionListener(this);
    }
    public void actionPerformed(ActionEvent event) {
        switch(Integer.parseInt(event.getActionCommand())) {
        case 1: ani.fill(); break;
        case 2: ani.hide(); break;
    }
    }
    public static void main( String[] args ){
      new AnimationWindow();
    }
}
  class Animation extends JPanel implements ActionListener {
      public static final long serialVersionUID = 1L;
     
      private Ellipse2D.Float ellipse = new Ellipse2D.Float();
      private double esize = 0;
      private double mSize = 40;
      private Timer timer;
     
      public void fill() {
        timer = new Timer(20, this);
        timer.start();
      }
      public void hide() {
        ellipse.setFrame(ellipse.getX(), ellipse.getY(), 1, 1);
        esize = 0;
        repaint();
        }
      public void paint(Graphics g) {
        super.paintComponent(g);
        Graphics2D g2 = (Graphics2D) g;
        RenderingHints rh = new RenderingHints(RenderingHints.KEY_ANTIALIASING, RenderingHints.VALUE_ANTIALIAS_ON);
        rh.put(RenderingHints.KEY_RENDERING, RenderingHints.VALUE_RENDER_QUALITY);
        g2.setRenderingHints(rh);
        g2.setColor(Color.black);
        g2.fill(ellipse);
      }
   
      public void actionPerformed(ActionEvent e) {
            esize++;
            if (esize < mSize) {
                ellipse.setFrame(ellipse.getX(), ellipse.getY(), esize, esize);
                repaint();
            }
            else {
                timer.stop();
            }
        }
    }

Super, danke HonniCilest, hast mir echt geholfen ;)
 
Zuletzt bearbeitet von einem Moderator:
Zurück