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
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: