我试图在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
课程。
答案 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
的值。