谁知道如何依次绘制图形基元

时间:2013-10-28 16:10:43

标签: java

首先说矩形,然后说一行例如

import java.awt.Graphics;
import java.awt.Color;
import java.awt.Canvas;
import javax.swing.JComponent;
import javax.swing.JFrame;

//class MyCanvas extends JComponent {   

class MyCanvas extends Canvas {
   public void paint(Graphics g) {
      g.fillRect(20, 20, 500, 500);
   }
}

class Linie extends MyCanvas {
   public void paint(Graphics g) {
      g.setColor(new Color(0, 255, 0));
      g.drawLine(30, 40, 300, 100);

   }
}

public class LinieUndRec {
   public static void main(String[] a) {
      JFrame window = new JFrame();
      window.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
      window.setBounds(100, 100, 800, 800);
      window.getContentPane().add(new MyCanvas());
      window.getContentPane().add(new Linie());
      window.setVisible(true);
   }
}

此代码仅绘制一条线 如何绘制矩形和直线

1 个答案:

答案 0 :(得分:3)

Linie类的实现中,您将为paint方法提供代码。这个替换了<{1}}类paint方法的代码,因为MyCanvas

因此,当您在Linie extends MyCanvas的实例上调用paint()时,只运行Linie方法中的代码,而不是两者都运行。如果您希望它同时运行,请添加:

Linie.paint()

作为旁注,即使上面的代码应该有效,类型继承并不意味着解决这类问题。我只是想提供所提供代码的答案。

如果你真的想画一个矩形后面跟一行,那就在一个代表一个矩形的对象上调用class Linie extends MyCanvas { public void paint(Graphics g) { super.paint(g); // This will draw the rectangle from the parent class, // then render the line below g.setColor(new Color(0,255,0)); g.drawLine(30,40, 300, 100); } } ,然后在一个代表一条线的对象上调用.paint(),一个接一个。你在这里拥有的是......好吧,非常糟糕的代码(如果你是Java的新手,那也没关系 - 我们都是新手一次)。您正在使用继承来完成只需在彼此之后调用两个.paint()命令即可​​完成的任务。

同样@Durandal指出,您可以使用单个画布来完成所有绘图。每次绘图操作不需要一个画布。把.paint()想象成你可以画的表面,就像一张纸,或者像画家的画布一样。并将绘图操作视为如何构建绘画的说明。一般来说,您必须先在后台绘制内容,然后在前台绘制内容。结果是先发生的绘图会被稍后发生的绘图所掩盖。