【问题标题】:Unconnected ovals while drawing too fast绘制太快时未连接的椭圆
【发布时间】:2014-01-02 12:50:07
【问题描述】:

我正在编写必须绘制平滑连接线的 Applet,我正在使用这条线(用户正在输入笔的宽度)

    public void mouseDragged(MouseEvent arg0)
    {   
    g.setColor(kolor);
    int width=Integer.parseInt(szPedzel.getText());
    g.fillOval(arg0.getX(), arg0.getY(), width, width); 
    }

其中 g = this.getGraphics();

当我画得有点慢时这很好,但是当我画得更快时会显示单个椭圆,有没有什么方法可以让这个椭圆形?

img:http://i42.tinypic.com/1536x04.png

【问题讨论】:

    标签: java drawing awt java-2d custom-painting


    【解决方案1】:

    不,你不想这样画:

    public void mouseDragged(MouseEvent arg0)
    {   
      g.setColor(kolor);
      int width=Integer.parseInt(szPedzel.getText());
      g.fillOval(arg0.getX(), arg0.getY(), width, width); 
    }
    

    在哪里g = this.getGraphics();

    如果您在组件上使用getGraphics(),那么由此获得的 Graphics 对象将是短暂的,并且您的所有结果图像都存在无法正确绘制的风险。不相信我?然后在运行时最小化并恢复您的 GUI,并观察您的椭圆消失。

    相反,我建议:

    • 给你的绘图组件一个ArrayList<Point>
    • 在您的 GUI 的 paintComponent(Graphics g) 方法(如果这是一个 Swing GUI)中,遍历 List 在每个点之间绘制线条。
    • 在 MouseMotionListener 中,将 Points 添加到 List 并调用 repaint()
    • 如果您想要更粗的线条,则将您的 Graphics 对象转换为 Graphics2D 对象并在其上调用 setStroke(Stroke s),传入一个粗细大于 1 的 BasicStroke 对象。

    • 例如,请查看this link

    【讨论】:

      【解决方案2】:

      不要使用getGraphics 这不是自定义绘画的完成方式。

      这是不可靠的,因为它可以返回 null,这只是上一个绘制周期中绘制的内容的快照,并且内容将在下一个绘制周期中被丢弃。

      自定义绘画最好通过覆盖从 JComponent 扩展的组件的 paintComponent 方法来实现

      查看Performing Custom Painting 了解更多详情和Painting in AWT and Swing,因为每个想要在 Swing/AWT 中进行自定义绘画的人都应该知道它是如何工作的

      对于example

      【讨论】:

      • @HovercraftFullOfEels 回复你 +1 给你
      【解决方案3】:

      您需要记住之前的鼠标位置,然后在旧位置和新位置之间的每个点上绘制椭圆......

      ...或者看看画线功能是否可以做你需要的事情并在那里做同样的事情。

      【讨论】:

        【解决方案4】:

        您的鼠标不会一次一个像素地移动。为了更快,它会跳过一些。如果你想在中间画椭圆,那么我建议你使用“画线”的方法在空白处画椭圆。

        如果跳过像素,您将无法真正获得任何平滑度。这样做的算法会相当复杂。
        你能做的最好的就是在中间画一条椭圆线,记住最后一个点“mousegrab”被使用。

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2016-04-10
          • 2018-12-02
          • 1970-01-01
          • 2012-09-04
          • 1970-01-01
          • 1970-01-01
          • 2015-11-18
          相关资源
          最近更新 更多