Java 如何从圆列表中选择要从JFrame中删除的圆?

Java 如何从圆列表中选择要从JFrame中删除的圆?,java,swing,jframe,graphics2d,mouselistener,Java,Swing,Jframe,Graphics2d,Mouselistener,我有一个JFrame,里面有随机的圆圈(它们是随机生成的)。我想从Jframe中通过鼠标单击删除选定的圆,并根据删除的结果增加分数。。有什么想法吗 “我有一个计时器,可以在屏幕上创建一个新的圆圈。 此外,我还使用列表来存储创建的圆圈。(参考PublicCircle类) 我还有一个收缩功能,可以通过减小半径及时收缩圆。” private static final int WIDTH=700; 专用静态最终内部高度=700; 公共整数x,y; 专用静态最终整数D_W=500; 专用静态最终整数D_H

我有一个JFrame,里面有随机的圆圈(它们是随机生成的)。我想从Jframe中通过鼠标单击删除选定的圆,并根据删除的结果增加分数。。有什么想法吗

“我有一个计时器,可以在屏幕上创建一个新的圆圈。 此外,我还使用列表来存储创建的圆圈。(参考PublicCircle类) 我还有一个收缩功能,可以通过减小半径及时收缩圆。”

private static final int WIDTH=700;
专用静态最终内部高度=700;
公共整数x,y;
专用静态最终整数D_W=500;
专用静态最终整数D_H=500;
私人名单圈;
随机=新随机();
公共交通半径;
公共整数延迟=50;
公共静态int寿命=10;
公共静态积分=0;
私人名单圈;
公共静态积分=0;
公共游戏模型(){
设置大小(宽度、高度);//设置帧宽度和高度
圆圈=新的ArrayList();
计时器计时器=新计时器(250,新ActionListener(){
//用于在JFrame上创建新球的计时器
@凌驾
已执行的公共无效操作(操作事件e){
int randX=random.nextInt(D_W);//或任何面板宽度
int randY=random.nextInt(D_H);//或面板的任何高度
randRadius=random.nextInt(101)+50;//半径
Color=Color.BLUE;
圆=新圆(randRadius,color,randX,randY);
圆。添加(圆);
update();//只需重新绘制();
}
});
timer.start();
}
@凌驾
受保护的空心油漆组件(图形g){//随机绘制圆
超级组件(g);
对于(圆:圆){
圆。画圆(g);
}
}
@凌驾
公共维度getPreferredSize(){
返回新维度(D_W,D_H);
}
公开课圈{//及时缩小球的课
公共整数半径x,y;
颜色;
公共圆(整数半径、颜色、整数x、整数y){
这个。半径=半径;
这个颜色=颜色;
这个.x=x;
这个。y=y;
ActionListener计数器=新建ActionListener(){
已执行的公共无效操作(操作事件evt){
更新();
拉迪乌斯--;
}};
新定时器(延迟、计数器).start();
}
公共空白绘图圈(图g){
g、 设置颜色(颜色);
g、 圆角(x,y,半径*2,半径*2);
}
}
私有类ClickCircle扩展MouseApter{
公共无效鼠标按下(MouseEvent e){
选中=空;
...                     
如果(已选择!=null){
分数++;
系统输出打印项次(“分数”+分数);
}
}
}

不要创建自己的Circle类。相反,您可以使用
Ellipse2D.Double(…)

Ellipse2D类实现了
Shape
接口。
Shape
接口实现了一个
contains(…)
方法。因此,您可以遍历列表中的所有对象,并检查
形状是否包含鼠标点

所以我会把你的“圆圈”类称为“ShapeInfo”类。此类将包含两个属性:

  • 形状
  • 颜色
  • 因此,您的基本代码是:

    //Circle circle = new Circle(randRadius, color, randX, randY);
    //circles.add(circle);
    Shape shape = new Ellipse2D.Double(...);
    ShapeInfo info = new ShapeInfo(shape, color);
    shapes.add( info );
    
    将来,您甚至可以在列表中添加
    矩形
    形状或任何其他形状

    有关此概念的更多一般信息,请参阅

    update(); //it is simply repaint();
    

    然后调用repaint()。这是确保正确重新绘制组件的正确调用方法。

    不要创建自己的Circle类。相反,您可以使用
    Ellipse2D.Double(…)

    Ellipse2D类实现了
    Shape
    接口。
    Shape
    接口实现了一个
    contains(…)
    方法。因此,您可以遍历列表中的所有对象,并检查
    形状是否包含鼠标点

    所以我会把你的“圆圈”类称为“ShapeInfo”类。此类将包含两个属性:

  • 形状
  • 颜色
  • 因此,您的基本代码是:

    //Circle circle = new Circle(randRadius, color, randX, randY);
    //circles.add(circle);
    Shape shape = new Ellipse2D.Double(...);
    ShapeInfo info = new ShapeInfo(shape, color);
    shapes.add( info );
    
    将来,您甚至可以在列表中添加
    矩形
    形状或任何其他形状

    有关此概念的更多一般信息,请参阅

    update(); //it is simply repaint();
    

    然后调用repaint()。这是确保正确重新绘制组件的正确调用方法。

    1)要更快获得更好的帮助,请添加或。2) 使用缩进代码行和代码块的逻辑和一致形式。缩进的目的是使代码的流程更易于遵循!1) 为了更快地获得更好的帮助,请添加或。2) 使用缩进代码行和代码块的逻辑和一致形式。缩进的目的是使代码的流程更易于遵循!但是在ShapeInfo类中如何缩小圆呢?没有半径@camickrOr阅读椭圆API。您可以重置椭圆的形状,甚至可以创建一个新的椭圆对象,只需更改椭圆的宽度/高度。这样做不需要半径。仿射变换在t中更通用