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

Odpowiedz Nowy wątek
2015-01-03 13:11
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){}
}   
 
}
 
}

Pozostało 580 znaków

2015-01-03 13:19
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.


Na PW przyjmuje tylko (ciekawe!) zlecenia. Masz problem? Pisz na forum, nie do mnie.
edytowany 1x, ostatnio: Shalom, 2015-01-03 13:19

Pozostało 580 znaków

2015-01-03 14:24
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.


To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-01-03 14:53
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();  
}

To smutne, że głupcy są tak pewni siebie, a ludzie mądrzy - tak pełni wątpliwości. Bertrand Russell

Pozostało 580 znaków

2015-01-03 16:08
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ę :)

Pozostało 580 znaków

2015-01-03 20:58
0

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

Pozostało 580 znaków

Odpowiedz
Liczba odpowiedzi na stronę

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