我设置的条件不允许椭圆形状进一步超出框架的极限宽度。例如,当椭圆形的x坐标超过框架的500宽度时,椭圆形状将向后移动。但在我的程序中没有任何事情发生,形状仍然超出设定的限制宽度。有人可以检查我的代码。谢谢。
package movingball;
import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;
public class MovingBall extends JPanel{
private int ballX = 30;
private int ballY = 30;
public MovingBall(){
setBackground(Color.BLACK);
}
public MovingBall(int x, int y){
x = this.ballX;
y = this.ballY;
repaint();
}
public static void main(String[] args) {
JFrame frame = new JFrame();
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500,700);
MovingBall movingBall = new MovingBall();
frame.add(movingBall);
frame.setVisible(true);
BallUsingThread ball = new BallUsingThread(movingBall);
Thread first = new Thread(ball);
first.start();
}
@Override
public void paintComponent(Graphics canvas){
super.paintComponent(canvas);
canvas.setColor(Color.BLUE);
canvas.fillOval(ballX, ballY, 100, 100);
}
public void animateBall(){
boolean horizontalBoundary = true;
boolean verticalBoundary = true;
if(horizontalBoundary){
ballX += 30;
if((ballX +100 >= 500)){
ballX -= 100;
//horizontalBoundary = false;
}
}
if(horizontalBoundary == false){
// if(ballX + 100 <= 0 ){
// horizontalBoundary = true;
// }
ballX -= 30;
}
repaint();
}
}
class BallUsingThread implements Runnable{
private final MovingBall movingBall;
public BallUsingThread(MovingBall mb){
movingBall = mb;
}
@Override
public void run() {
for(;;){
movingBall.animateBall();
try {
Thread.sleep(100);
} catch (InterruptedException ex) {
System.out.printf("Error",ex);
}
}
}
}
答案 0 :(得分:1)
根据您提供的内容我不知道确切的解决方案,但我有一些猜测:
您在代码中使用了几个布尔值。 此时,这些布尔值是在方法中创建的,因此每次调用方法时,它们都设置为true。这意味着第一个if语句总是被激活,并且球将始终向右移动,在此if。
在您检查时,当球向左移动时,您正在检查球是否已离开屏幕&lt; =而不是到达边界&gt; =
在这一刻,我猜到了这个方法,因为我不知道重绘方法在做什么,也许错误就在那里?
if(horizontalBoundary == false)
等于if(!horizontalBoundary)
这可以更具可读性。
在if((ballX +100 >= 500))
中,您可以删除括号:if(ballX +100 >= 500)
如果只想使用if语句设置布尔变量,可以缩短范围:horizontalBoundary = (ballX + 100 <= 0 );