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

时间:2016-09-13 16:56:42

标签: java swing

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

我有一个用随机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);


    }

}

我有一个类,它为ArrayList创建一个JFrame和Add square元素。但我无法弄明白。我认为解决方案可能很简单和技术性,我只需要轻微推动。

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);

    }



}

2 个答案:

答案 0 :(得分:2)

摆脱Square类并重新启动。

  • 不要让它扩展Canvas - 你不想不必要地混合AWT和Swing
  • 您的Square类应该是逻辑类,而不是GUI类,这意味着它不应该扩展任何GUI组件。
  • 不要在绘画方法中随机化。
  • 给你的Square类x和y int字段
  • 给它一个public void draw(Graphics g)方法,使用传入的Graphics对象绘制自己。
  • 创建另一个类,一个扩展JPanel,并给它一个ArrayList<Square>
  • 覆盖此JPanel的paintComponent方法。
  • 在覆盖中一定要调用超级方法。
  • 在覆盖中,遍历数组列表,调用每个Square的绘图方法。
  • 将此JPanel放入JFrame。

答案 1 :(得分:0)

从我看到你正在做的事情,你正在为相互重叠的画面添加多个画布。

而是创建一个画布,其中包含在其绘画中绘制的Squares(x和y int)列表,然后向该帧添加一个画布。

此外,我不确定JFrame.add()是否会添加整个画布并调整其大小。而是使用layoutManager添加像FlowLayout这样的组件。 Layout managers