Java JFrame没有显示所需的图形

时间:2019-02-27 15:18:41

标签: java

我在语音标记中出现了小故障,因为我确信这不是小故障。

我最近才开始使用JFrames进行编码,实际上几个月前我就在学校里开始使用Java,但是最近我试图用这些方便的框架来推动我的理解。

我制作了一个程序,该程序可以在框架周围弹起一个球,所以我想使其变成2(现在它们不会发生碰撞),但是每当我尝试添加另一个时,它只会显示一个。 这是代码:

public static void main(String[] args) throws InterruptedException{
    JFrame frame = new JFrame("Hello There");
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
    frame.setSize(400, 400);
    frame.setVisible(true);
    frame.setLayout(new FlowLayout());
    Main ball = new Main();
    Main ball2 = new Main();
    ball2.SetValues(200, 200, Color.BLUE);
    frame.add(ball2);
    frame.add(ball);

    while (true) {
        ball.move();
        ball.repaint();
        ball2.move();
        ball2.repaint();
        Thread.sleep(5);
    }
}

public void move() {

    x = x + xDirection;
    y = y + yDirection;
    if (x < 0) { //If Ball has gone off the screen on x direction
        xDirection = 1; //Start moving to the right
    } else if (x > getWidth() - 50) { //If x has gone off the screen to the right
        xDirection = -1;//Start moving to the left
    }

    if (y < 0) { //If Ball has gone off the screen on x direction
        yDirection = 1; //Start moving to the right
    } else if (y > getHeight() - 50) { //If x has gone off the screen to the right
        yDirection = -1;//Start moving to the left
    }
}

public void paint(Graphics g) {
    super.paint(g);
    g.setColor(color);
    g.fillOval(x, y, 50, 50);
}

我最近添加了“ frame.setLayout(new FlowLayout()”行,它似乎显示了两个球,但它们处于故障状态。

有人可以帮我吗?

1 个答案:

答案 0 :(得分:0)

您不应该在Swing线程上睡觉或进行任何长时间的处理,也不应从其他线程更新gui。参见Concurrency in Swing
一种替代方法是使用javax.swing.Timer

Timer timer = new Timer(5, new ActionListener() {       
        @Override
        public void actionPerformed(ActionEvent e) {
            ball.move();
            ball.repaint();
            ball2.move();
            ball2.repaint();        
        }
 });
 timer.start();

另一种替代方法是使用separate thread

还建议您阅读Performing Custom Painting