Java 在杰帕内尔圆上的椭圆形';不要在不同的地点画画

Java 在杰帕内尔圆上的椭圆形';不要在不同的地点画画,java,swing,jpanel,paintcomponent,Java,Swing,Jpanel,Paintcomponent,我有一个面板,每次按下鼠标键时,我都要在上面画球。应该在鼠标按下的位置绘制球 球画得很好,但是每次都画在同一位置,所以除非我左右“移动”窗口,否则不会看到画出的球 这是我的密码: GUIBalls 出于某种奇怪的原因,这些球并没有被抽到不同的位置 所发生情况的照片附在附件中。 有什么想法吗?您的代码现在的问题是,您需要同时尝试执行自定义绘制和尝试创建自定义组件。您需要决定使用哪种方法 有关自定义绘制的基础知识,请阅读上的Swing教程中的部分,该部分有一个演示如何进行自定义绘制的工作示例。它展

我有一个面板,每次按下鼠标键时,我都要在上面画球。应该在鼠标按下的位置绘制球

球画得很好,但是每次都画在同一位置,所以除非我左右“移动”窗口,否则不会看到画出的球

这是我的密码:

GUIBalls
出于某种奇怪的原因,这些球并没有被抽到不同的位置

所发生情况的照片附在附件中。


有什么想法吗?

您的代码现在的问题是,您需要同时尝试执行
自定义绘制
和尝试创建
自定义组件
。您需要决定使用哪种方法

有关自定义绘制的基础知识,请阅读上的Swing教程中的部分,该部分有一个演示如何进行自定义绘制的工作示例。它展示了如何在面板上画一个正方形,但你明白了

如果要继续添加要绘制的对象,则需要将对象保留在ArrayList中,然后在paintComponent()方法中迭代列表以绘制每个对象。该方法在中得到了演示


如果要将球创建为组件,则需要确保覆盖“获取首选大小”以返回球的大小。然后始终在面板的偏移(0,0)处绘制椭圆。然后将球组件添加到使用空布局的父面板。由于使用空布局,因此将使用
setLocation(…)
方法在父面板上定位球。您还需要使用球组件的
setSize()
方法作为首选尺寸。

您使用的是
g.fillOval(0,0,z,w)
这意味着你总是在
x
位置
0
y
位置
0
@Titus处绘制椭圆。问题是,当我将0和0更改为其他值时,球根本不抽签。虽然抽签了,但它们很可能是在
的可见区域之外抽签的。@Titus谢谢你。我该如何解决这个问题?相反,你可以在
面板上的特定位置轻松绘制椭圆形。谢谢你的精彩帖子!我会仔细阅读你的链接。
public class GUIBalls {
public  JFrame frame = new JFrame("Balls");
public  JPanel panel = new JPanel();
private ArrayList<Ball> b = new ArrayList<>();
private Random rnd = new Random();

public GUIBalls(){
    setFrame();
    //moveBalls();
}
public void setFrame(){
    this.frame.setBounds(0,0,400,400);
    this.frame.add(panel);
    panel.setBounds(0,0,400,400);
    this.panel.addMouseListener(new MouseListener() {
        @Override
        public void mouseClicked(MouseEvent e) {
        }

        @Override
        public void mousePressed(MouseEvent e) {
            int x = e.getX();
            int y = e.getY();
            createBalls(x,y);
        }

        @Override
        public void mouseReleased(MouseEvent e) {
        }

        @Override
        public void mouseEntered(MouseEvent e) {
        }

        @Override
        public void mouseExited(MouseEvent e) {
        }
    });
}
public void createBalls(int x, int y){
    Ball ball = new Ball(x,y,10,10);
    this.b.add(ball);
    ball.draw(panel);
    panel.repaint();
}
}
public class Ball extends JPanel {
int x;
int y;
int z;
int w;

public Ball(int x, int y, int z, int w) {
    this.x = x;
    this.y = y;
    this.z = z;
    this.w = w;
}

public void paintComponent(Graphics g) {
    super.paintComponent(g);
    g.fillOval(0, 0, z, w);

}

public void draw(JPanel panel) {
    panel.add(this);
    panel.setVisible(true);

}
}