如何初始化Graphics变量?
我尝试了Graphics g = new Graphics()
和Graphics g;
,但它说它无法实例化。我需要将Graphics g
从一个方法传递给另一个方法,所以我不能只从参数中调用它。任何帮助表示赞赏。
这是我的代码:
import java.awt.Graphics;
import java.awt.Color;
import java.awt.Image;
import java.applet.Applet;
import java.lang.Math;
import java.util.Random;
public class testApp extends JApplet
{
public void init()
{
this.add(new RandomCardsPanel());
}
public RandomCardsPanel extends JPanel
{
public Image card1, card2, card3, card4, card5, card6, card7, card8, card9, card10, card11, card12, card13;
public Image card14, card15, card16, card17, card18, card19, card20, card21, card22, card23, card24, card25, card26;
public Image card27, card28, card29, card30, card31, card32, card33, card34, card35, card36, card37, card38, card39;
public Image card40, card41, card42, card43, card44, card45, card46, card47, card48, card49, card50, card51, card52;
public RandomCardsPanel()
{
Image[] card = new Image[52];
card[0] = getImage( getDocumentBase(), "c1.gif" );
card[1] = getImage( getDocumentBase(), "c2.gif" );
card[2] = getImage( getDocumentBase(), "c3.gif" );
card[3] = getImage( getDocumentBase(), "c4.gif" );
card[4] = getImage( getDocumentBase(), "c5.gif" );
card[5] = getImage( getDocumentBase(), "c6.gif" );
card[6] = getImage( getDocumentBase(), "c7.gif" );
card[7] = getImage( getDocumentBase(), "c8.gif" );
card[8] = getImage( getDocumentBase(), "c9.gif" );
card[9] = getImage( getDocumentBase(), "c10.gif" );
card[10] = getImage( getDocumentBase(), "cj.gif" );
card[11] = getImage( getDocumentBase(), "cq.gif" );
card[12] = getImage( getDocumentBase(), "ck.gif" );
card[13] = getImage( getDocumentBase(), "d1.gif" );
card[14] = getImage( getDocumentBase(), "d2.gif" );
card[15] = getImage( getDocumentBase(), "d3.gif" );
card[16] = getImage( getDocumentBase(), "d4.gif" );
card[17] = getImage( getDocumentBase(), "d5.gif" );
card[18] = getImage( getDocumentBase(), "d6.gif" );
card[19] = getImage( getDocumentBase(), "d7.gif" );
card[20] = getImage( getDocumentBase(), "d8.gif" );
card[21] = getImage( getDocumentBase(), "d9.gif" );
card[22] = getImage( getDocumentBase(), "d10.gif" );
card[23] = getImage( getDocumentBase(), "dj.gif" );
card[24] = getImage( getDocumentBase(), "dq.gif" );
card[25] = getImage( getDocumentBase(), "dk.gif" );
card[26] = getImage( getDocumentBase(), "h1.gif" );
card[27] = getImage( getDocumentBase(), "h2.gif" );
card[28] = getImage( getDocumentBase(), "h3.gif" );
card[29] = getImage( getDocumentBase(), "h4.gif" );
card[30] = getImage( getDocumentBase(), "h5.gif" );
card[31] = getImage( getDocumentBase(), "h6.gif" );
card[32] = getImage( getDocumentBase(), "h7.gif" );
card[33] = getImage( getDocumentBase(), "h8.gif" );
card[34] = getImage( getDocumentBase(), "h9.gif" );
card[35] = getImage( getDocumentBase(), "h10.gif" );
card[36] = getImage( getDocumentBase(), "hj.gif" );
card[37] = getImage( getDocumentBase(), "hq.gif" );
card[38] = getImage( getDocumentBase(), "hk.gif" );
card[39] = getImage( getDocumentBase(), "s1.gif" );
card[40] = getImage( getDocumentBase(), "s2.gif" );
card[41] = getImage( getDocumentBase(), "s3.gif" );
card[42] = getImage( getDocumentBase(), "s4.gif" );
card[43] = getImage( getDocumentBase(), "s5.gif" );
card[44] = getImage( getDocumentBase(), "s6.gif" );
card[45] = getImage( getDocumentBase(), "s7.gif" );
card[46] = getImage( getDocumentBase(), "s8.gif" );
card[47] = getImage( getDocumentBase(), "s9.gif" );
card[48] = getImage( getDocumentBase(), "s10.gif" );
card[49] = getImage( getDocumentBase(), "sj.gif" );
card[50] = getImage( getDocumentBase(), "sq.gif" );
card[51] = getImage( getDocumentBase(), "sk.gif" );
String cardNumber;
double cardRandom;
int cardRandomNumber;
public int[] ranNum = new int[10];
Random ran = new Random();
for (int number = 0; number <= 9; )
{
cardRandom = ran.nextInt(52) + 1;
cardRandomNumber = (int)Math.round( cardRandom );
if ( cardRandomNumber > 0 && cardRandomNumber <= 52 )
{
ranNum[number] = cardRandomNumber;
number++;
}
}
}
public void paintComponent(Graphics g)
{
setBackground( Color.green );
g.drawImage( cards[ranNum[0]], 10, 10, this);
}
}
}
答案 0 :(得分:2)
通常,您不需要初始化Graphics
变量,因为大多数绘画应该在组件paintComponent()
方法中完成。 (并且你不能Graphics g = new Graphics();
因为Graphics
是一个抽象类。)通常我会创建一个扩展JPanel
的类并覆盖paintComponent()
方法来执行我的自定义绘画。从那里,我可以将Graphics
引用传递给任何其他需要它的方法。
试一试。当然,我在一个非常抽象的层面上谈论。让我们知道您从这些提示中得到什么,我们将从那里开始工作。
修改强>
JComponent
声明了一个抽象方法paintComponent(Graphics g)
。如果要提供自己的实现,必须完全匹配此方法签名。这意味着您只能使用一个参数,即Graphics
对象。
您可以自由创建具有更多参数的paintComponent()
方法,但由于方法签名不匹配,当操作系统决定您的Applet需要时,它不会在事件调度线程上自动调用重新绘制。
话虽如此,您不必延长JPanel
以使其发挥作用。您可以扩展任何具有JComponent
作为祖先的类。在您的特定情况下,JPanel
似乎是最佳选择。我建议您按如下方式重构代码:
在RandomCards.java中
public RandomCards extends JApplet {
public void init() {
this.add(new RandomCardsPanel();
}
}
在RandomCardsPanel.java中
public RandomCardsPanel extends JPanel {
// Put private member variables here
public RandomCardsPanel() {
// Put code from your current init() method here
}
public void paintComponent(Graphics g) {
// Put your custom painting code here, including setting the background color and drawing the card images
}
}
如果您不介意,我还有一些建议:
请注意,我正在延长JApplet
而不是Applet
。这是首选课程。 Applet
仍然是为了向后兼容AWT。现代Java小程序使用JApplet
和Swing代替。
缩进代码时,请使用空格而不是制表符。选项卡以与系统相关的方式显示。这意味着,如果您在其他编辑器或另一台计算机上查看代码,则选项卡格式的代码可能无法按预期方式显示。特别是,您可以看到此网站未正确格式化您的代码。大多数文本编辑器都有一个用空格替换制表符的设置。我强烈建议您了解如何与您合作。
如果您发现自己使用的变量名称只与数字后缀不同(例如Image card1, card2, card3, card4, card5
等),则应使用数组。
您 使用init()
方法中的数组。但是,您已将其声明为局部变量。这意味着您的其他任何方法都无法看到您在此处声明的card
数组。您应该将此声明为成员变量而不是card1, card2, card3
等变量。您需要在paintComponent()
方法中使用的任何其他变量也是如此,因为它只能有一个Graphics g
参数。
您无需明确调用paintComponent()
。实际上,你不应该明确地调用它。只要合适,系统就会调用此方法。
我希望这有助于澄清几点。祝你的Java经验好运。如果您还有其他问题,请告诉我们。
答案 1 :(得分:2)
这里有两个问题:
Graphics g1;
a.paint(g1);
您收到G1未初始化的错误。那是因为变量g1永远不会设置为任何东西,这会导致编译错误。要获得编译代码,您至少需要这样做:
Graphics g1 = null;
a.paint(g1);
然而,这显然不会帮助你太多。当您尝试运行代码时,您将收到NullPointerException。为了实际绘制你的图形,你需要这样做:
So1 a=new So1();
Graphics g1 = So1.getGraphics();
a.paint(g1);
<强>例如强>
import java.awt.*;
import javax.swing.*;
import java.applet.*;
public class So1 extends Applet{
public void paint (Graphics g)
{
g.drawString("hello",40,30);
}
public static void main(String ad[])
{
JFrame jp1 = new JFrame();
So1 a=new So1 ();
jp1.getContentPane().add(a, BorderLayout.CENTER);
jp1.setSize(new Dimension(500,500));
jp1.setVisible(true);
}
}
现在注意,我们实际上并没有自己调用paint()函数。这是由awt处理的,它实际上选择了图形上下文,并为我们调用了paint函数。但是,如果你想要,你可以传入你想要的任何图形对象,并要求它绘制它。 (所以如果你想将你的组件绘制到图像上,你可以这样做)
答案 2 :(得分:1)
根据Java Graphics类的文档是抽象的,所以你无法实例化它。