You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何创建同一类的多个对象?以创建Ball类的两个对象为例

嘿,我来帮你搞定创建多个Ball对象的问题~先看看你现有代码里的几个小问题,然后一步步实现:

1. 先搞定Ball类的定义

首先你得有一个Ball类,它需要继承Actor(假设Actor是你的自定义基类,或者是继承自JComponent的UI类)。这里给你一个示例实现,包含绘制逻辑:

import java.awt.Color;
import java.awt.Graphics;
import javax.swing.JComponent;

// 假设Actor是JComponent的子类,如果不是的话需要调整绘制逻辑
public class Ball extends Actor {
    private int x, y;
    private Color color;

    public Ball(int x, int y, Color color) {
        this.x = x;
        this.y = y;
        this.color = color;
        // 设置Ball的大小和初始位置
        setSize(50, 50);
        setLocation(x, y);
    }

    // 重写paintComponent来绘制圆形的Ball
    @Override
    protected void paintComponent(Graphics g) {
        super.paintComponent(g);
        g.setColor(color);
        g.fillOval(0, 0, getWidth(), getHeight());
    }
}
2. 修正World类的addObject方法

你的addObject现在是把Actor直接加到frame上,但JFrame默认用BorderLayout,多次add会导致后面的组件覆盖前面的。而World本身就是JPanel,应该把Actor加到当前的JPanel(也就是this)上,同时记得刷新界面:

import javax.swing.JFrame;
import javax.swing.JPanel;

public class World extends JPanel { 
    JFrame frame = new JFrame("GreenJ"); 
    Actor[] actor = new Actor[100]; 
    int n = 0; 
    
    public World() { 
        frame.add(this); 
        frame.setSize(1000, 1000); 
        // 给JPanel设置布局,比如用null布局来手动控制Ball位置,或者用FlowLayout自动排列
        this.setLayout(null); 
        frame.setVisible(true); 
        frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    } 
    
    public void addObject(Actor a) { 
        // 避免数组越界
        if (n < actor.length) {
            actor[n] = a; 
            this.add(actor[n]); // 加到当前JPanel而不是frame
            n++;
            this.repaint(); // 添加后刷新界面,确保Ball显示出来
        }
    } 
}

另外,尽量别在构造函数里抛出InterruptedException,如果有耗时操作,放到单独线程里更合适。

3. 在MyWorld中创建多个Ball对象

现在你可以在MyWorld的构造函数里实例化两个Ball,调用addObject把它们添加到世界里:

import java.awt.Color;

public class MyWorld extends World { 
    public MyWorld() {
        super(); // 调用父类的构造函数初始化窗口
        
        // 创建第一个红色Ball,位置(100, 100)
        Ball redBall = new Ball(100, 100, Color.RED);
        addObject(redBall);
        
        // 创建第二个蓝色Ball,位置(300, 300)
        Ball blueBall = new Ball(300, 300, Color.BLUE);
        addObject(blueBall);
    }
}
额外提示
  • 如果你的Actor类不是JComponent的子类,那不能直接作为组件添加到JPanel,这时候需要在World的paintComponent方法里遍历actor数组,逐个绘制每个Ball的图形
  • 如果用null布局,一定要给每个Ball设置setLocation和setSize,不然组件会看不到
  • 要是需要Ball动起来,可以用Swing Timer来定时更新位置并调用repaint()

内容的提问来源于stack exchange,提问作者ElAdriano

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.20 12:07:36