gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-30 08:21:58 24 4
gpt4 key购买 nike

我制作了一个游戏,当我以低速为实体制作动画时,我使用 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(...) 方法完成的,然后将面板添加到框架中。阅读 Custom Painting 上的 Swing 教程部分获取更多信息和工作示例。

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

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

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com