超出框架边框时,形状不会返回

时间:2016-02-27 15:12:03

标签: java swing awt

我设置的条件不允许椭圆形状进一步超出框架的极限宽度。例如,当椭圆形的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);
            }
        }      
    }   
}

1 个答案:

答案 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 );