Płynna animacja obrazków po wciśnięciu przycisku

0

Mam problem z przyciskiem chce zeby moje obrazki przesunely sie płynnie o x przy kliknieciu. Zrobilem for, ktory powinien to wykonywac niestety kiedy klikam przycisk obrazki nagle przeskakuja na docelowe miejsce bez plynnej animacji. Najgorsze jest to ze ten for dziala jezeli nie uzywam przycisku i wklejam go pod r.setVisible(true);.

package prostaanimacja;

import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Graphics;
import java.awt.Image;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.ImageIcon;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class ProstaAnimacja implements ActionListener 
{
JFrame r;
JButton p;
int x = 10;
int y = 300;
public static void main(String[] args) 
{
ProstaAnimacja a = new ProstaAnimacja();
a.Dzialaj();
}

public void Dzialaj() 
{
this.r = new JFrame("Animacja");
r.setSize(500, 700);
r.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

this.p = new JButton("start");
p.setSize(100, 10);
p.setBackground(Color.white);
r.getContentPane().add(BorderLayout.SOUTH,p);
p.addActionListener(this);

Rysuj g = new Rysuj();
r.getContentPane().add(g);

r.setVisible(true);

}
public class Rysuj extends JPanel
{

@Override
public void paintComponent(Graphics g)
{
  
Image o1 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\2.jpg").getImage();
Image o2 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\3.jpg").getImage();
Image o3 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\4.jpg").getImage();
Image o4 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\5.jpg").getImage();

g.drawImage(o1, x, 30, r);
g.drawImage(o2, y, 350, r);
g.drawImage(o3, y, 60, r);
g.drawImage(o4, x, 310, r);
//g.setColor(Color.red);
//g.fillOval(x, y, 70, 70);
}    
}

@Override
public void actionPerformed(ActionEvent zdarzenie)
{
 for (int i=0;i<300;i++)
{
x++;
r.repaint();
try
{
    Thread.sleep(50);
}
catch (Exception ex){}
}   

    
}


}
0

Wątki ;] Robisz to swoje malowanie wewnątrz metody GUI więc całe GUI wisi. Podbij licznik tej pętli do dużej wartości i zobaczysz co się dzieje. Musisz malować w osobnym wątku żeby efekt był taki jakiego oczekujesz.

1

A za to

public void paintComponent(Graphics g)
{
 
Image o1 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\2.jpg").getImage();
Image o2 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\3.jpg").getImage();
Image o3 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\4.jpg").getImage();
Image o4 = new ImageIcon("C:\\Users\\Judytka\\Desktop\\my\\5.jpg").getImage();
...

tzn. za odczytywanie obrazków z dysku przy każdym odrysowywaniu okna, powinieneś dostać dożywotni zakaz programowania.

1

Masz przykład z użyciem Timera - Timer działa w osobnym wątku.

public void actionPerformed(ActionEvent zdarzenie)
{
    final Timer timer = new Timer(50, new ActionListener()
    {
        public void actionPerformed(ActionEvent e)
        {
            x++;
            r.repaint();
            if(x > 300)
            {
                x = 10;
            }
        }
    });
    timer.start();  
}
0

Dzieki użyłem Timera wszystko wygląda tak jak powinno. W wątki nie bede sie na razie zagłebiał bo to chyba dosc obszerny temat a jak widac mam do poćwiczenia inne rzeczy np jak inaczej odczytac jpg ? Ucze sie Javy dopiero od miesiąca wiec zdaje sobie sprawe,że robie ogromne błedy dobrze ze są tacy jak Ty na tym świecie którzy wskażą dobrą drogę :)

0

ikonki wczytaj raz a następnie je cachuj, tzn. zapisz do mapy i stamtad je sczytuj

1 użytkowników online, w tym zalogowanych: 0, gości: 1