使用带有Graphics2D的链式方法

时间:2014-09-16 16:56:43

标签: java swing paintcomponent graphics2d

public class FaceComponent extends JComponent
{  
   public void paintComponent(Graphics g)
   {  
      Graphics2D g2 = (Graphics2D) g;
      Ellipse2D.Double head = new Ellipse2D.Double(5, 10, 100, 150);
      Rectangle eye = new Rectangle(25, 70, 15, 15);
      Line2D.Double mouth = new Line2D.Double(30, 110, 80, 110);
      g2.setColor(Color.GREEN)
        .fill(eye)
        .eye.translate(50, 0);
        .fill(eye)
        .setColor(Color.RED)
        .draw(mouth)
        .setColor(Color.BLUE)
        .drawString("Hello, World!", 5, 175);
   }
}

有没有理由将对象g2上的方法链接起来导致错误“无法调用(方法)原始类型void,我可能会忽略它?

2 个答案:

答案 0 :(得分:4)

你不能在Graphics对象上链接方法调用,因为它的方法调用不会返回Graphics对象,而是返回void。

变化

  g2.setColor(Color.GREEN)
    .fill(eye)
    .eye.translate(50, 0);
    .fill(eye)
    .setColor(Color.RED)
    .draw(mouth)
    .setColor(Color.BLUE)
    .drawString("Hello, World!", 5, 175);

  g2.setColor(Color.GREEN);
  g2.fill(eye);
  g2.eye.translate(50, 0);
  g2.fill(eye);
  g2.setColor(Color.RED);
  g2.draw(mouth);
  g2.setColor(Color.BLUE);
  g2.drawString("Hello, World!", 5, 175);

实际上,Graphics或Graphics2D方法都没有返回自身的实例。 create()方法确实返回Graphics对象但不是同一个。快速浏览一下API会告诉你这一点,将来,我建议你这样做是为了类似的问题。

答案 1 :(得分:4)

方法setColorfill等具有void返回类型,因此无法像这样链接,而是需要单独调用

g2.setColor(Color.GREEN);
g2.fill(eye);
...