下面的代码是在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();
}
}
答案 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系统和其他低级别的内容,例如drawImage
或drawString
,如果您还没有这样做的话。 / p>
答案 2 :(得分:0)
使用Java2D通常有助于将您的应用程序想象成动画。想象一下,在屏幕上绘制一个特定的帧(我说的是动画帧好)。当某些事件发生时,我们将这个框架替换为包含更改的另一个框架,就像构建卡通或动画电影的方式一样。我们如何绘制动画帧?我们如何在帧之间切换?
Java API为其绘制的组件提供绘制(图形g)方法。然后更新你真正调用repaint()的相同组件,它再次简单地调用paint(Graphics g)并在屏幕上显示任何更改。这个API方法有一个严格的签名,我们将遵循。它是油漆(图形g)。但是Graphics2D很像一个很酷的孩子,提供更多的功能,因为图形太旧(遗留)而且不再酷。那么我们怎么做呢,因为paint(Graphics g)只接受Graphics而不是Graphics2D? Graphics2D是Graphics okay的子类 协议很简单,
您的代码出现问题: 这只是签名。 Java和repaint()期望该方法是绘制(Graphics g),但是您已经更改了签名,现在上面的协议(或合同)被破坏了。我们的想法是保持合同(不改变签名),然后进行类型转换和覆盖以添加扩展功能。 Java无法找到paint(Graphics g),因此repaint()也不会找到paint(Graphics g)。