0

下面的代码是在小程序中显示一个三角形。但它对我不起作用。如果我通过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();

    }

}
4

3 回答 3

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

---------------->%----------------------
于 2013-08-31T05:45:41.247 回答
1

在寻求帮助之前,请仔细查看您的程序正在做什么。(不是骂你,只是想为未来提供帮助。)

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

此外,下一行将是另一个标志:Graphics2D g2 = (Graphics2D) g; 在这里,您将对象转换Graphics2DGraphics2D对象...这永远不需要发生..哈哈

如果您刚刚开始使用 swing 和 Graphics2D,我建议您学习一些面板系统和其他低级的东西,例如drawImageor drawString,如果您还没有这样做的话。

于 2013-08-31T05:56:37.253 回答
0

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

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

  1. 使用每个组件的旧版paint(Graphics g) 方法。
  2. 一旦我们使用了 super.paint(Graphics g) (如果需要),我们可以将我们用于遗留目的的 Graphic 对象类型转换为 Graphics2D 以获得增强功能。(您已正确完成此步骤)

您的代码有问题: 它只是签名。Java 和 repaint() 期望该方法是 paint(Graphics g) 但您已经更改了签名,现在上述协议(或合同)被破坏了。这个想法是保留合同(通过不更改签名),然后进行类型转换和覆盖以添加扩展功能。Java 无法找到paint(Graphics g),因此repaint() 也无法找到paint(Graphics g)。

于 2013-08-31T06:33:15.173 回答