首页 > 解决方案 > 模拟水滴的程序

问题描述

1.这是我在程序中所做的。我唯一的问题是它不会抹去我之后创建的圆圈,因为我希望它像水波一样具有流畅的运动。

 private void jPanel1MouseClicked(java.awt.event.MouseEvent evt) {                                     
        int radio = 0;

        try {
            radio = Integer.parseInt(radio1.getText());
        } catch (NumberFormatException e) {
            System.out.println("ERROR. Introduzca un numero");
        }

        int x = evt.getX();
        int y = evt.getY();
        int x1 = x - radio / 2;
        int y1 = y - radio / 2;
        for (int i = 0; i <= 10; i++) {

            jPanel1.getGraphics().drawOval(x1, y1, radio, radio);

            radio += 10;
            x1 = x - radio / 2;
            y1 = y - radio / 2;

            try {
                Thread.sleep(20);

            } catch (InterruptedException ex) {
                Logger.getLogger(NewJFrame.class.getName()).log(Level.SEVERE, null, ex);
            }
            jPanel1.repaint();
        }

    }                             

标签: java

解决方案


Java 的 GUI 是单线程的。只要jPanel1MouseClicked方法执行,一切都会暂停,因此您无法在方法内部设置动画。它与处理大型事物时熟悉的应用程序挂起/冻结相同。

您需要Timer从可以推进动画“状态”并重绘的构造函数开始。

然后,您需要创建一个或多个数据结构来存储您过去的所有鼠标坐标以及半径(无线电?)。

计时器应该增加圆圈的半径并重新绘制所有内容。如果面板不透明,您可以利用它来发挥自己的优势。

(您可能想要删除太旧或半径太大的坐标,否则内存会无限增长)


推荐阅读