Le déplacement de la Balle en Java
quand je le lance, le repeindre ne fonctionne pas. La fenêtre s'ouvre et reste pour 2000ms et puis se ferme. autre chose, si je retire le Système.exit(0); déclaration, il n'est pas ferme, mais le peint ballon n'est pas toujours présente.
BallWorld.java
import java.awt.*;
import javax.swing.JFrame;
public class BallWorld extends Frame {
public static void main(String[] args) {
BallWorld bw1 = new BallWorld(Color.red);
bw1.show();
}
public static final int framewidth = 600;
public static final int frameheight = 400;
private Ball aball;
private int counter = 0;
private BallWorld(Color ballColor){
setSize(framewidth,frameheight);
setTitle("Ball World");
aball = new Ball(10, 15, 5);
aball.setColor(ballColor);
aball.setMotion(3.0, 6.0);
}
public void paint(Graphics g){
aball.paint1(g);
aball.move();
if((aball.x() < 0) || (aball.x() > framewidth))
aball.setMotion(-aball.xMotion(), aball.yMotion());
if((aball.yMotion() < 0) || (aball.yMotion() > frameheight))
aball.setMotion(aball.xMotion(),-aball.yMotion());
//redraw the frame
counter = counter + 1;
if(counter < 2000)
repaint();
else
System.exit(0);
}
}
l'autre classe est
Ball.java
import java.awt.*;
import java.awt.Rectangle;
public class Ball {
protected Rectangle location;
protected double dx,dy;
protected Color color;
public Ball(int x,int y, int r){
location =new Rectangle(x-r, y-r, 2*r, 2*r);
dx=0; //initially no motion
dy=0;
color = Color.blue;
}
//Setters
public void setColor(Color newColor){
color = newColor;
}
public void setMotion(double new_dx, double new_dy){
dx = new_dx;
dy = new_dy;
}
//Getters
public int radius(){
return location.width/2;
}
public int x(){
return location.x + radius();
}
public int y(){
return location.y + radius();
}
public double xMotion(){
return dx;
}
public double yMotion(){
return dy;
}
public Rectangle region(){
return location;
}
//Methods that change attributes of the ball
public void moveTo(int x, int y){
location.setLocation(x, y);
}
public void move(){
location.translate((int) dx,(int) dy);
}
public void paint1(Graphics g){
g.setColor(color);
g.fillOval(location.x, location.y,location.width,location.height);
}
}
Vous devez vous connecter pour publier un commentaire.
paint
de haut niveau des conteneurs, vous êtes entré dans un de la raison pour laquelle vous ne devriez pasrepaint
ou toute autre méthode qui pourrait appelerrepaint
à l'intérieur de toutpaint
méthode, il va créer une boucle infinie qui consomment votre CPUMaintenant, à la base de votre problème. Fondamentalement, vous êtes en train de peindre dans le cadre de la décoration. Cela se produit parce que la fenêtre a ajouté des décorations à l'intérieur de la zone visible, pas supplémentaire sur elle.
Voir Comment faire pour obtenir l'EXACT milieu de l'écran, même lors de la ré-taille et Comment puis-je mettre dans le milieu? pour plus de détails
C'est pourquoi il est recommandé que vous ne pas écraser la peinture de haut niveau dans des conteneurs. Vous avez besoin de créer un composant qui peut être ajouté à l'image, et sur lequel vous pouvez ensuite peindre