我制作了一个游戏,当我以低速动画实体时,我使用 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/