java - Graphics2D.draw(Shape) 方法不准确

标签 java swing animation draw graphics2d

我制作了一个游戏,当我以低速动画实体时,我使用 g.FILL(new Ellipse2D.Float(x, y, r, r));因为它可以呈现平滑流畅的运动。

它工作正常(在示例蓝色左圆圈中)。但是当我只需要一个圆圈的轮廓时,我使用 g.DRAW(new Ellipse2D.Float(x, y, w, h));它不起作用,我完全不知道出了什么问题。没有流畅的运动,圆圈逐个像素地跳跃,看起来很丑(在示例红色右圆圈中)Graphics2D.draw(Shape)像 int 值一样计算浮点值。

这个示例代码演示了它,不用研究太多,只需导入、运行和观看即可。

public class Example extends JFrame {

    public static void main(String[] args) { new Example(); }

    public Example() {

        setBounds(50, 50, 400, 400);
        setVisible(true);

        while(true) {
            x1 += 0.01;
            y1 += 0.01;
            x2 -= 0.01;
            y2 += 0.01;
            try {
                Thread.sleep(16);
            } catch (InterruptedException e) {
                e.printStackTrace();
            }
            repaint();
        }
    }

    double x1 = 50 , y1 = 50;
    double x2 = 250, y2 = 50;

    @Override
    public void paint(Graphics gg) {
        Graphics2D g = (Graphics2D) gg;
        g.setRenderingHint(RenderingHints.KEY_ANTIALIASING,
                         RenderingHints.VALUE_ANTIALIAS_ON);
        g.setColor(Color.BLUE);
        g.fill(new Ellipse2D.Double(x1, y1, 100, 100));
        g.setColor(Color.RED);
        g.draw(new Ellipse2D.Double(x2, y2, 100, 100));
    }
}

那么,如果不使用填充两个圆圈或移动圆圈图像等技巧,我该如何解决这个问题呢?感谢您的每一个回答。

最佳答案

我猜问题是你没有调用 super.paint(...) 作为方法中的第一个语句,这意味着你失去了一些默认的绘画功能。

但是,这不是正确的解决方案,因为您根本不应该重写 JFrame 的 Paint() 方法。自定义绘制是通过重写 JPanel 的“paintComponent(...)”方法来完成的,然后将面板添加到框架中。阅读 Swing 教程中关于 Custom Painting 的部分了解更多信息和工作示例。

此外,不要对动画使用 while true 循环。相反,您应该使用 Swing Timer 来安排动画(本教程有关于 Swing Timer 的部分)。您的代码之所以有效,是因为您没有正确创建 GUI。 GUI 应在事件调度线程上创建。自定义绘画教程向您展示如何使用 invokeLater(...) 方法来执行此操作。本教程还有一个关于 Swing 中的并发 的部分,其中更详细地解释了这个概念。

关于java - Graphics2D.draw(Shape) 方法不准确,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/24726327/

相关文章:

ios - UIView.animate with imageArray inside UIScrollView 但效果类似于分页启用

java - Jpanel 元素尺寸过大

java - 钱能买到的最好的工具

java - 将 HQL 解析为 AST 结构并将 AST 转换回 HQL

java - SlidingDrawer 启动时半打开

java - 在 JPanel 之间切换(隐藏/显示)

java - 自定义 TableModel 中的 NullPointerException

css - 交错无限CSS动画

javascript - 使代码适用于多个链接

java - 如何从 Firebase 查询