Animatie maken

  • Onderwerp starter Onderwerp starter Tybs
  • Startdatum Startdatum
Status
Niet open voor verdere reacties.

Tybs

Gebruiker
Lid geworden
19 dec 2006
Berichten
14
Hallo allemaal,

Ik probeer een soort animatie te maken binnen Java, maar tot nog toe wil het niet echt lukken. Op dit moment heb ik de volgende klassen, Main en DrawingPanel (excuses voor de slechte opmaak, maar ik krijg het er niet beter in op forums):


import java.awt.*;
import java.awt.event.*;
import javax.swing.*;

/**
* Write a description of class Main here.
*
* @author Tybs
* @version 0.1
*/
public class Main extends JFrame
{
private DrawingPanel dp; // dp = drawingPanel
private static JButton test;
private static Graphics graph;
JFrame frame;
private int border = 80;

public Main(){
dp = new DrawingPanel();
dp.setLayout( null );
setContentPane( dp );
test = new JButton( "Test" );
TestHandler khtest = new TestHandler();
test.addActionListener( khtest );
test.setBounds( 0, 0, border, 30 );
}

public static void main(){
JFrame frame = new Main();
frame.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );
frame.setSize( 400, 400 );
frame.setTitle( "DFC" );
frame.setVisible( true );
frame.add( test );
}

public class TestHandler implements ActionListener{
public void actionPerformed( ActionEvent e ){
dp.round();
}
}
}



import java.awt.*;
import javax.swing.*;

/**
* Write a description of class DrawingPanel here.
*
* @author Tybs
* @version 0.1
*/

public class DrawingPanel extends JPanel{
private int bodyStartX = 200;
private int bodyStartY = 150;
private int bodyLength = 40;

private int angleLeftArm = 135;

private int flag1X;
private int flag1Y;

public void paintComponent( Graphics g ){
super.paintComponent( g );
setBackground( Color.WHITE );
g.drawOval( bodyStartX-13, bodyStartY-26, 26, 26 ); //head
drawStandard( g, bodyStartX, bodyStartY, 270, bodyLength ); //body
drawStandard( g, bodyStartX, bodyStartY+(bodyLength/4), angleLeftArm, bodyLength/4*5 ); //left-arm
drawFlag1( g, bodyStartX, bodyStartY+(bodyLength/4), angleLeftArm, bodyLength/4*5 ); //left-flag
drawStandard( g, bodyStartX, bodyStartY+(bodyLength/4), 45, bodyLength/4*5 ); //right-arm
drawStandard( g, bodyStartX, bodyStartY + bodyLength, 255, bodyLength/2*3 ); //left-leg
drawStandard( g, bodyStartX, bodyStartY + bodyLength, 285, bodyLength/2*3 ); //right-leg
}

public void drawStandard( Graphics g, int x, int y, int a, int l ){
g.drawLine( x, y, (int)(x+Math.cos(a/180.0*Math.PI)*l), (int)(y-Math.sin(a/180.0*Math.PI)*l));
}

public void drawFlag1( Graphics g, int x, int y, int a, int l ){
flag1X = (int)(x+Math.cos(a/180.0*Math.PI)*l);
flag1Y = (int)(y-Math.sin(a/180.0*Math.PI)*l);
drawStandard( g, flag1X, flag1Y, a, bodyLength/4*3 );
for( int i = 0; i < bodyLength/2; i++ ){
drawStandard( g, (int)(flag1X+(i*Math.cos(a/180.0*Math.PI))),
(int)(flag1Y-(i*Math.cos(a/180.0*Math.PI))), a, bodyLength/4*3 );
}
}

public void round(){
for( int i = 0; i < 360; i++ ){
angleLeftArm = i;
repaint();
sleep();
}
}

private void sleep() {
try{
this.wait(10);
}
catch( InterruptedException e ) {}
}
}



Het idee is als volgt. Wanneer ik "Main" start, wordt er een draadmannetje getekend die een vlag vasthoudt. Dit gedeelte is geen probleem. Nou moet hij wanneer ik op de "Test" knop druk, met zijn vlag een rondje zwaaien. Dit lukt me helaas niet... als ik op de knop druk wacht hij een paar seconden, en gaat dan ineens in de eindpositie staan.

Ik denk dat het probleem ergens in deze methode ligt:

public void round(){
for( int i = 0; i < 360; i++ ){
angleLeftArm = i;
repaint();
sleep();
}
}

Met sleep wordt er this.wait(10) gebruikt. Als ik in plaats daarvan Thread.sleep(10) toepas, krijg ik hetzelfde resultaat. Het ligt naar mijn idee aan sleep of aan de repaint() methode. Heeft iemand enig idee hoe ik dit gegeven werkende kan krijgen?

Bij voorbaat dank,
Tybs
 
Laatst bewerkt:
Begin even om
Code:
 -
tags om je code heen te zetten.
Dan krijg je namelijk dit:

Code:
import java.swing.*;

public class Test {
  private String naam;
  private String adres;
  
  public test() {
    // constructor
  }
  
  public static void main(String[] args) {
    Test test = new Test();
  }
}

Dan is het daarna ook makkelijker kijken.
Ik ben zelf ook een beginner, dus verwacht niet te veel van me, maar ik wil er ook graam van leren.
Ik zag alvast 1 opmerkelijk iets in je code, namelijk dat je een JFrame object aanmaakt van het type Main.
Is het zo en zo niet zo dat je Main niet als class-naam kunt gebruiken omdat main een gereserveerd woord is in Java?

Als je een JFrame wilt maken doe je dat zo:

JFrame frame = new JFrame();
 
Bedankt voor de tip van de tags, dat helpt idd. Ondertussen ben ik er uitgekomen hoe dit gefixed moest worden... het gebruiken van meerdere threads is de oplossing :)
 
Status
Niet open voor verdere reacties.
Terug
Bovenaan Onderaan