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

时间:2014-07-13 19:17:46

标签: 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));
    }
}

那么如何在没有像填充圆圈的两个圆圈或移动图像的技巧的情况下修复它?谢谢你的每一个答案。

2 个答案:

答案 0 :(得分:2)

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

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

此外,请勿对动画使用while true循环。相反,您应该使用Swing Timer来安排动画(本教程有一个关于Swing Timers的部分)。您的代码只能正常工作,因为您没有正确创建GUI。应在Event Dispatch Thread上创建GUI。自定义绘画教程向您展示如何使用invokeLater(...)方法执行此操作。本教程还有一个关于Concurrency in Swing的部分,它更详细地解释了这个概念。

答案 1 :(得分:1)

使用Java中的绘制圆/椭圆/椭圆,“纯”模式通常有助于以亚像素精度绘制它:

input_html

我的其他答案有更多详情:https://stackoverflow.com/a/31221395/1143274