gpt4 book ai didi

java - 为什么球没有从正确的坐标开始?

转载 作者:行者123 更新时间:2023-12-04 14:46:07 25 4
gpt4 key购买 nike

我正在做一些事情,让球从给定的坐标绕着棋盘反弹,但它不起作用。无论我做什么,球总是从左上角开始移动。

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JFrame;
import javax.swing.JPanel;


public class Board extends JPanel {

// Board dimensions
int width;
int height;

// Ball size
int radius = 4;
int diameter = radius * 2;

// Ball initial position
int X = radius + 239;
int Y = radius + 100;

// Direction
int dx = 3;
int dy = 3;

public Board() {
Thread thread = new Thread() {
public void run() {
while (true) {
repaint();
width = getWidth();
height = getHeight();

X = X + dx ;
Y = Y + dy;

if (X - radius < 0) {
dx = -dx;
X = radius;
} else if (X + radius > width) {
dx = -dx;
X = width - radius;
}

if (Y - radius < 0) {
dy = -dy;
Y = radius;
} else if (Y + radius > height) {
dy = -dy;
Y = height - radius;
}

try {
Thread.sleep(10);
} catch(InterruptedException ex) {}
}
}
};
thread.start();
}

public void paintComponent(Graphics g) {
super.paintComponent(g);
g.setColor(Color.BLUE);
g.fillOval((int)(X - radius), (int)(Y - radius), (int)diameter, (int)diameter);
}

public static void main(String[] args) {
JFrame frame = new JFrame("Bouncing Ball");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
frame.setSize(500, 300);
frame.setContentPane(new Board());
frame.setVisible(true);
frame.setResizable(false);
}
}

在添加 thread.start(); 之前,球位于正确的位置,但只要我这样做,球就会回到左上角。

帮助将不胜感激!

最佳答案

问题是您的线程在将 Board 的 JPanel 添加到 JFrame 并确定其布局之前启动,因此面板的宽度和高度为零。

正确的做法是等到框架及其面板都设置好后再开始线程。

一个快速而肮脏的解决方案是在获得宽度和高度后立即添加一行 if (width == 0 || height == 0) continue;。这依赖于面板最初创建时的宽度和高度为零这一事实,因此它现在不会对您的球进行任何计算,直到您的面板尺寸为非零为止。

更好的解决方案是在 main 函数的末尾做这样的事情:

 EventQueue.invokeLater(new Runnable() {
public void run() {
board.thread.start();
}
});

这假设您现在将板存储在一个名为 board 的变量中,并且您的 Board 类将其 Thread 存储在一个名为 thread 的字段中。这将等到 Swing 完成其事件队列中的其他任务(并因此完成设置您的框架和面板),然后再启动您的线程。

关于java - 为什么球没有从正确的坐标开始?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70026635/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com