将随机图形正方形添加到ArrayList(JAVA)

将随机图形正方形添加到ArrayList(JAVA),java,swing,Java,Swing,我想学习在java中与图形元素一起使用ArrayList 我有一个类可以创建具有随机x和随机y位置的正方形: import java.awt.Canvas; import java.awt.Color; import java.awt.Graphics; import java.util.Random; public class Square extends Canvas { public int x, y; Random r = new Random(); p

我想学习在java中与图形元素一起使用ArrayList

我有一个类可以创建具有随机x和随机y位置的正方形:

import java.awt.Canvas;
import java.awt.Color;
import java.awt.Graphics;
import java.util.Random;

public class Square extends Canvas {

    public int x, y;

    Random r = new Random();


    public void paint(Graphics g) {

        x = r.nextInt(640);
        y = r.nextInt(480);


        g.setColor(Color.BLACK);
        g.fillRect(x, y, 30, 30);


    }

}
我有一个类,它创建了一个JFrame并向ArrayList添加了正方形元素。但我想不出来。我认为解决方案可能简单而技术性强,我只需要稍微推动一下

import java.util.ArrayList;

import javax.swing.JFrame;

public class Frame {

    public int width, height;
    public String title;

    public JFrame jframe;

    ArrayList<Square> squares  = new ArrayList<Square>();

    public Frame(String title, int width, int height) {

        this.width = width;
        this.height = height;
        this.title = title;



        display();
    }

    public void display() {

        jframe = new JFrame();

        jframe.setTitle(title);
        jframe.setSize(width, height);
        jframe.setResizable(false);
        jframe.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        jframe.setVisible(true);
        jframe.setLocationRelativeTo(null);

        for(int i = 0; i < 20; i++) {
            squares.add(new Square());
        }
        jframe.add(squares);

    }



}
import java.util.ArrayList;
导入javax.swing.JFrame;
公共类框架{
公共int宽度、高度;
公共字符串标题;
公共JFrame;
ArrayList squares=新的ArrayList();
公共框架(字符串标题、整数宽度、整数高度){
这个。宽度=宽度;
高度=高度;
this.title=标题;
显示();
}
公共空间显示(){
jframe=新的jframe();
jframe.setTitle(title);
jframe.setSize(宽度、高度);
jframe.setresizeable(false);
jframe.setDefaultCloseOperation(jframe.EXIT_ON_CLOSE);
jframe.setVisible(true);
jframe.setLocationRelativeTo(空);
对于(int i=0;i<20;i++){
添加(新的正方形());
}
jframe.add(正方形);
}
}

从我看到您正在做的事情来看,您正在向框架添加多个画布,这些画布将相互重叠

而是创建一个画布,其中包含在其绘制中绘制的正方形列表(x和y整数),然后将一个画布添加到框架中

另外,我不确定JFrame.add()是否会添加整个画布并调整其大小。而是使用layoutManager添加组件,如FlowLayout。
摆脱Square类并重新启动

  • 不要让它扩展画布——您不希望不必要地混合AWT和Swing
  • 您的Square类应该是逻辑类,而不是GUI类,这意味着它不应该扩展任何GUI组件
  • 请勿在绘制方法中随机化
  • 给你的平方类x和y整型字段
  • 给它一个
    public void draw(Graphics g)
    方法,其中它使用传入的图形对象绘制自己
  • 创建另一个类,一个扩展JPanel的类,并给它一个
    ArrayList
  • 重写此JPanel的
    paintComponent
    方法
  • 在覆盖中,确保调用super的方法
  • 在覆盖中,遍历数组列表,调用每个正方形的draw方法
  • 将此JPanel放入JFrame中

您的问题需要更多信息。想不出是什么?您是否遇到编译时或运行时错误?如果是,什么?你是否有意外的行为?如果是这样的话,你预计会发生什么?到底发生了什么?等等,到底是什么问题?这个是否编译(毫无疑问-假设没有
JFrame.add(List)
方法)?此外,建议使用,例如
JPanel
,而不是
Canvas
。非常感谢您的帮助!