绘制圆圈:将代码分离为类

时间:2018-03-31 02:53:37

标签: java swing

我试图在mousePressed事件中绘制具有随机颜色和随机直径的圆圈,但是当我尝试组织我的代码时,我遇到了一些问题"分开我的代码进入类"。

控制器类

public class Controller implements MouseListener {
private HashSet<Circle> circleSet = new HashSet<>();
private int r,g,b,d;

@Override
public void mousePressed(MouseEvent e) {
    r = new Random().nextInt(256);
    g = new Random().nextInt(256);
    b = new Random().nextInt(256);
    d = 10+new Random().nextInt(100);

    circleSet.add(new Circle(e.getX()-d/2,e.getY()-d/2,d,d,new 
    Color(r,g,b),0,0));
}

public HashSet<Circle> getCircleSet() {
    return circleSet;
}

@Override
public void mouseClicked(MouseEvent e) {}

@Override
public void mouseReleased(MouseEvent e) {}

@Override
public void mouseEntered(MouseEvent e) {}

@Override
public void mouseExited(MouseEvent e) {}
}

查看课程

public class View extends JPanel{
Controller controller;
HashSet<Circle> circleHashSet;
public View() {
    repaint();
    controller = new Controller();
    circleHashSet = controller.getCircleSet();
    this.addMouseListener(controller);
    listen();

    System.out.println(circleHashSet.size());
}

public void listen() {
    new javax.swing.Timer(100, new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent e) {
            circleHashSet = controller.getCircleSet();
            System.out.println(circleHashSet.size());
        }
    });
}

@Override
public void paintComponents(Graphics g) {
    super.paintComponents(g);
    for (Circle circle:this.circleHashSet) {
        paintCircle(g,circle);
    }
    System.out.println(circleHashSet);
}

public void paintCircle(Graphics graphics, Circle circle) {
    graphics.setColor(circle.color);
    graphics.fillOval(circle.x,circle.getY(),circle.a,circle.b);
}
即使我这样做,

circleHashSet仍然是空的:

//circleHashSet = controller.getCircleSet();

按下鼠标后,圈子会添加到circleSet,但我无法将其加入View课程。

2 个答案:

答案 0 :(得分:0)

首先,问题在于您使用paintComponents(Graphics g)方法而不是paintComponent(Graphics g)方法。

如果你完成了更改,你应该为圈子创建一个单独的Circle POJO类,因为基本Java API中唯一可用的可用圆圈来自JavaFX包。

设置圆圈类的构造函数后,您可以更轻松地添加到HashSet。像这样:circleSet.add(new Circle(e.getX() - d / 2, e.getY() - d / 2, d, new Color(r, g, b)));

另一个问题是您创建的Timer对象从未用于任何事情。首先,您应该创建一个Timer对象,在初始化之后,调用它上面的start()方法开始检查圈子。

答案 1 :(得分:-1)

把这行代码

    circleHashSet = controller.getCircleSet();

paintComponents()方法中。原因是当您启动程序时,您只获得HashSet的值,而此时hashset为空。用鼠标绘制后,您应该更新circleHashSet的值。