Reputation: 260
Im quiet new in java graphics programming, but i didnt thougt i would have problems right at the beginning:
I have this simple loop - which moves and resizes the cube, but its very slow and "unclean". I can see the pixels changing, when you know what i mean. What could i do better here? And why its so slow? Thank you all!
So, heres the code:
package game;
import javax.swing.*;
import java.awt.*;
public class Main extends JPanel implements Runnable{
Box b = new Box(0, 0, 20, 20);
Thread t = new Thread(this);
public Main(){
JFrame f = new JFrame();
f.setSize(800, 600);
f.setLocationRelativeTo(null);
f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
f.setLayout(null);
f.setVisible(true);
setBounds(0, 0, f.getWidth(), f.getHeight());
setBackground(Color.BLUE);
f.add(this);
t.start();
}
public void paintComponent(Graphics g){
super.paintComponent(g);
b.paint(g);
}
public void run(){
while(b.x < 100){
b.x++;
b.y++;
b.width++;
b.height++;
repaint();
try{Thread.sleep(10);}catch(Exception e){}
}
}
public static void main(String[] args) {
new Main();
}
public class Box {
public int x;
public int y;
public int width;
public int height;
public boolean used;
public Box(int x, int y, int width, int height){
this.x = x;
this.y = y;
this.width = width;
this.height = height;
}
public void paint(Graphics g){
g.setColor(Color.GREEN);
g.fillRect(x, y, width, height);
}
}
}
Upvotes: 1
Views: 886
Reputation: 27113
I'd use a Swing Timer
as mentioned in the comments, otherwise there's nothing obviously wrong with your code.
However, to get perfectly smooth graphics on screen, you need to have "vertical sync" (that is, the entire painting must be done between screen refresh). I suggest you have a look at How to use BufferStrategy in Java for a start.
EDIT
Out of curiosity, I did some experiments using the ideas found in the blog post above, and while the animation became quite smooth, I did not achieve full vsync using Java 6 on OS X. I still get some "tearing". This was quite a disappointment.
Upvotes: 4