java - 画圈 : separation of code into classes

标签 java swing

我正在尝试在 mousePressed 事件上绘制具有随机颜色和随机直径的圆圈,但是当我尝试稍微组织我的代码时遇到了一些问题“将我的代码分成类” .

Controller 类

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) {}
}

查看类(class)

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 类中。

最佳答案

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

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

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

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

关于java - 画圈 : separation of code into classes,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49583772/

相关文章:

Java查找所有具有特定值的键

java - 我的 JSlider 和下面的文本之间有巨大的空间

java - JEdi​​torPane、httpClient 和子图像

java - JLabel 上的选项卡空间未显示 - 奇怪 - Java

java - 无法从 java 客户端调用 HTTPS 不受信任的 URL

java - 如何在 JAVA 中开发/组装 SOAP 缓存

java - 如何在java中下载没有内存问题的大文件

java - 如何用 guice 替换反射?

java - 如果应用程序崩溃,JUnique 锁定的应用程序不会运行

java - 随着时间的推移定期调用重新绘制