Witam, muszę napisać program program z krzywą beziera, część programu już mam, teraz tylko nie wiem jak zrobić animację by po kliknięciu w button włączała się animacja... Na razie chcę zrobić animację linii, żeby w ogóle zobaczyć jak to działa, jednak nie działa mi to tak jak należy, tzn kiedy kliknę button program tak jakby się zawiesza button przez chwilę pozostaje wciśnięty a następnie rysuje mi się ostateczny wygląd animacji. Wiem, że usypiam cały wątek i dlatego tak się dzieje, jednak nie wiem jak mam to zrobić by animacja działała:( z góry dzięki za pomoc i wyrozumiałość co do błedów w programie. Nie wrzucam pozostałych klas, chodzi mi o to by tą linie rysowało w paintComponent() gdzie wybor == 2 tzn animowało a nie usypiało cała aplikację:(, po wywołaniu z Main acctionPerformed funkcji panel.animacja()...
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
/**
*
* @author KJ
*/
import java.awt.BorderLayout;
import java.awt.GridLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.BorderFactory;
import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JSlider;
import javax.swing.event.ChangeEvent;
import javax.swing.event.ChangeListener;
public class MainBeizer {
/**
* @param args the command line arguments
*/
public static JFrame frame;
public static int WYSOKOSC = 724, SZEROKOSC = 1024;
public static JSlider fid = new JSlider(JSlider.VERTICAL, 1, 100,50);
public static boolean animacja = false;
public static void main(final String[] args) throws InterruptedException {
frame = new JFrame("Krzywa");
frame.setSize(SZEROKOSC,WYSOKOSC);
frame.setLayout(new BorderLayout(5,5));
final Panel panel = new Panel();
panel.setLayout(new BorderLayout());
panel.setBorder(BorderFactory.createTitledBorder("Krzywa"));
fid.addChangeListener(new ChangeListener() {
@Override
public void stateChanged(ChangeEvent e) {
JSlider source = (JSlider)e.getSource();
Panel.FID = source.getValue();
Panel.wybor = 1;
frame.repaint();
}
});
JButton anim = new JButton("Animuj");
anim.addActionListener(new ActionListener() {
@Override
public void actionPerformed(ActionEvent e) {
try {
panel.animacja();
} catch (InterruptedException ex) {
Logger.getLogger(MainBeizer.class.getName()).log(Level.SEVERE, null, ex);
}
}
});
JPanel panel1 = new JPanel();
panel1.setLayout(new BorderLayout());
panel1.add(fid, "Center");
panel1.add(anim, "East");
panel1.setBorder(BorderFactory.createTitledBorder("Obsluga"));
frame.add(panel, "Center");
frame.add(panel1, "East");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setVisible(true);
}
}
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
import java.awt.*;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.InputEvent;
import java.awt.event.MouseEvent;
import java.awt.event.MouseListener;
import java.awt.event.MouseMotionListener;
import java.awt.geom.Point2D;
import java.util.ArrayList;
import java.util.logging.Level;
import java.util.logging.Logger;
import javax.swing.*;
/**
*
* @author Krzych
*/
public class Panel extends JPanel implements ActionListener{
public Krzywa krzywaBe = new Krzywa();
public static int XXX, YYY, wybor = -1;
public int licznik = 0;
public Punkt []punkty = new Punkt[4];
public Punkt punkt;
public boolean rysujKrzywa = false;
public static int FID = 100;
public static boolean suwak = false;
public int licznik2=0;
public Panel()
{
addMouseListener(new MojaMyszka());
addMouseMotionListener(new MojaMyszkaPol());
}
@Override
public void paintComponent(Graphics g) {
super.paintComponent(g);
Graphics2D g2 = (Graphics2D) g;
if(wybor == 1)
{
g2.setColor(Color.BLACK);
if(licznik == 0 && suwak==true)
{
g2.fillRect(punkty[0].getX()-4, punkty[0].getY()-4, 8, 8);
}
else if(suwak == true){
for(int i=0;i<licznik;i++)
{
g2.fillRect(punkty[i].getX()-4, punkty[i].getY()-4, 8, 8);
}
}
if(rysujKrzywa == true)
{
for(int i=0;i<licznik;i++)
{
g2.drawLine(punkty[i].getX(), punkty[i].getY(), punkty[(i+1)%licznik].getX(), punkty[(i+1)%licznik].getY());
}
krzywaBe.changeKrzywa(punkty[0], punkty[1], punkty[2], punkty[3], FID);
g2.setColor(Color.RED);
Punkt[] krzywa = krzywaBe.getPunkty();
for(int i=0;i<(krzywaBe.getPunkty().length);i++)
{
int j = i+1;
if(j>=krzywaBe.getPunkty().length)
j = krzywaBe.getPunkty().length-1;
g2.drawLine(krzywa[i].getX(), krzywa[i].getY(), krzywa[j].getX(),krzywa[j].getY());
}
}
}
if(wybor == 2)
{
g2.drawLine(23+licznik2,23+licznik2,88+licznik2,88+licznik2);
}
}
@Override
public void actionPerformed(ActionEvent e) {
throw new UnsupportedOperationException("Not supported yet.");
}
protected class MojaMyszka implements MouseListener
{
public void mouseClicked(MouseEvent e) {
if((e.getModifiers() & InputEvent.BUTTON1_MASK) !=0)
{
if(licznik <4)
{
suwak = true;
dodajPunkt(e.getX(), e.getY());
}
else
nowyPunkt(e.getX(), e.getY());
}
if((e.getModifiers() & InputEvent.BUTTON3_MASK) !=0)
{
}
}
public void mousePressed(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseReleased(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseEntered(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet.");
}
public void mouseExited(MouseEvent e) {
//throw new UnsupportedOperationException("Not supported yet.");
}
}
protected class MojaMyszkaPol implements MouseMotionListener
{
public void mouseDragged(MouseEvent e) {
if(licznik ==4)
for(int i=0; i< licznik; i++)
{
if((e.getX() >= punkty[i].getX()-5 && e.getX() <= punkty[i].getX()+5) && (e.getY() >= punkty[i].getY()-5 && e.getY() <= punkty[i].getY()+5))
{
punkty[i].setX(e.getX());
punkty[i].setY(e.getY());
wybor = 1;
repaint();
}
}
}
public void mouseMoved(MouseEvent e) {
}
}
public void dodajPunkt(int xxxx, int yyyy)
{
punkt = new Punkt(xxxx, yyyy);
punkty[licznik] = punkt;
wybor = 1;
licznik++;
if(licznik == 4)
{
rysujKrzywa = true;
}
repaint();
}
public void nowyPunkt(int xxxx, int yyyy)
{
punkt = new Punkt(xxxx, yyyy);
for(int i = 0;i<3;i++)
{
punkty[i]=punkty[i+1];
}
punkty[3]=punkt;
wybor = 1;
repaint();
}
public void animacja() throws InterruptedException
{
for(int i = 0; i<30; i++)
{
wybor=2;
repaint();
Thread.sleep(100);
licznik2++;
}
}
}