-4

例如先说矩形,然后说一条线

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);
   }
}

这段代码只画一条线 如何画一个矩形和一条线

4

1 回答 1

3

在您的Linie类的实现中,您正在为该paint方法提供代码。这替换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()一个代表矩形的对象,然后调用.paint()一个代表一条线的对象,一个接一个。您在这里拥有的是……嗯,非常糟糕的代码(如果您是 Java 新手,那没关系 - 我们曾经都是新手)。您正在使用继承来完成只需依次调用两个.paint()命令即可完成的工作。

同样正如@Durandal指出的那样,您可以使用单个画布来绘制所有绘图。每次绘图操作不需要一个画布。把 a 想象Canvas成一个你可以在上面画画的表面,就像一张纸,或者,好吧,就像画家的画布。并将绘图操作视为构建绘画的指示。一般来说,你必须先画背景中的东西,然后再画前景中的东西。结果是先发生的绘制被后来发生的绘制所掩盖。

于 2013-10-28T16:19:29.010 回答