如何创建同一类的多个对象?以创建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
相关产品推荐
相关产品推荐

