绘图形状在graphics2D中不起作用

时间:2013-08-31 05:19:17

标签: java swing graphics applet japplet

下面的代码是在applet中显示一个三角形。但它对我不起作用。如果我通过Graphics g而不是Graphics2D g,那么它工作正常。但我想知道我在使用Graphics g时所犯的错误。我是java新手,并从一些在线教程中学习。所以请纠正我的程序并告诉我我在做什么错误。

import javax.swing.*;
import javax.swing.event.*;
import java.awt.*;
import java.awt.event.*;
import java.applet.*;
public class Vehicle extends JFrame {

    final int WIDTH = 900;
          int HEIGHT = 650;


    public void init() {

        setSize(WIDTH, HEIGHT);
        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

    }
    public void paint(Graphics2D g) {

 Graphics2D g2 = (Graphics2D) g;
     Dimension d = getSize();
     System.out.println(d);
            int[] yPoints={150,250,250};
            int[] xPoints={200,150,250};


        g2.setColor(Color.green);


        g2.drawPolygon(xPoints, yPoints, 3);
        g2.drawRect(100, 100, 100, 100);

        g2.setColor(Color.red);

        g2.fillPolygon(xPoints, yPoints, 3);
    }


    public static void main(String[] args) {
       Vehicle v= new Vehicle();
       v.init();

    }

}

3 个答案:

答案 0 :(得分:1)

方法paint(Graphics g)java.awt.Component中定义。这或多或少是遗留代码。但是,此API在很长一段时间内没有发生变化,并且由现代Swing组件继承,例如JFrame

您不能简单地更改方法签名(在您的情况下为paint(Graphics2D g)),您必须使用API​​定义的签名。

因此,在您的情况下,paint(Graphics2D g)不会覆盖API方法paint(Graphics g),因此在更新JFrame时不会调用。什么都没画。

更改您的代码:

----------------%<----------------------

        setDefaultCloseOperation(EXIT_ON_CLOSE);
        setVisible(true);

    }
    public void paint(Graphics g) { // <-- Change from Graphics2D to Graphics

 Graphics2D g2 = (Graphics2D) g;
     Dimension d = getSize();
     System.out.println(d);
            int[] yPoints={150,250,250};
            int[] xPoints={200,150,250};

---------------->%----------------------

答案 1 :(得分:1)

在寻求帮助之前,请仔细查看您的计划正在做什么。 (不要责骂你,只是试图帮助未来。)

你有public void paint(Graphics2D g),正如Petersen所说,它不是JFrame类中的方法。一个很好的技巧,用于检查你的方法是否会像教程所说的那样做,就是把@Override放在方法之上。如果它出错,则意味着该方法不在JFrame或您拥有的任何超类中。否则,它会覆盖该方法。

此外,另一个标志是下一行:Graphics2D g2 = (Graphics2D) g; 在这里,您将Graphics2D对象作为Graphics2D对象进行投射......这绝不应该发生..哈哈

如果您刚开始使用swing和Graphics2D,我建议您学习一些Panels系统和其他低级别的内容,例如drawImagedrawString,如果您还没有这样做的话。 / p>

答案 2 :(得分:0)

使用Java2D通常有助于将您的应用程序想象成动画。想象一下,在屏幕上绘制一个特定的帧(我说的是动画帧好)。当某些事件发生时,我们将这个框架替换为包含更改的另一个框架,就像构建卡通或动画电影的方式一样。我们如何绘制动画帧?我们如何在帧之间切换?

Java API为其绘制的组件提供绘制(图形g)方法。然后更新你真正调用repaint()的相同组件,它再次简单地调用paint(Graphics g)并在屏幕上显示任何更改。这个API方法有一个严格的签名,我们将遵循。它是油漆(图形g)。但是Graphics2D很像一个很酷的孩子,提供更多的功能,因为图形太旧(遗留)而且不再酷。那么我们怎么做呢,因为paint(Graphics g)只接受Graphics而不是Graphics2D? Graphics2D是Graphics okay的子类 协议很简单,

  1. 使用每个组件的旧版paint(Graphics g)方法。
  2. 一旦我们使用了super.paint(Graphics g)(如果需要),我们可以将我们用于遗留目的的Graphic对象类型转换为Graphics2D以获得增强功能。(你已经完成了这一步)
  3. 您的代码出现问题: 这只是签名。 Java和repaint()期望该方法是绘制(Graphics g),但是您已经更改了签名,现在上面的协议(或合同)被破坏了。我们的想法是保持合同(不改变签名),然后进行类型转换和覆盖以添加扩展功能。 Java无法找到paint(Graphics g),因此repaint()也不会找到paint(Graphics g)。