1

如何初始化 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);
    }
}

}

4

3 回答 3

2

通常您不需要初始化Graphics变量,因为大多数绘制应该在组件paintComponent()方法中完成。(你不能这样做Graphics g = new Graphics();,因为Graphics它是一个抽象类。)通常我会创建一个类来扩展JPanel并覆盖该paintComponent()方法来进行我的自定义绘画。从那里,我可以将Graphics引用传递给需要它的任何其他方法。

试试这个。当然,我说的是相当抽象的水平。让我们知道您从这些提示中发现了什么,我们将从那里开始工作。

编辑:

JComponent声明一个抽象方法paintComponent(Graphics g)。如果您想提供自己的实现,则必须完全匹配此方法签名。这意味着您只允许使用一个参数,即Graphics对象。

您可以自由地创建paintComponent()具有更多参数的方法,但由于方法签名不匹配,因此当操作系统决定您的 Applet 需要重新绘制时,它不会在 Event Dispatch Thread 上自动调用。

话虽如此,您不必扩展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
    }
}

如果您不介意,我还有一些建议:

  1. 请注意,我正在扩展JApplet而不是Applet. 这是首选课程。Applet仍然存在与 AWT 的向后兼容性。现代 Java 小程序使用JApplet和 Swing 代替。

  2. 缩进代码时,使用空格而不是制表符。选项卡以系统相关的方式显示。这意味着如果您在另一个编辑器或另一台计算机上查看您的代码,选项卡格式的代码可能不会按照您的预期方式显示。特别是,您可以看到该网站没有正确格式化您的代码。大多数文本编辑器都有用空格替换制表符的设置。我强烈建议你找出如何用你的方法做到这一点。

  3. 当您发现自己使用的变量名称仅与数字后缀不同(例如Image card1, card2, card3, card4, card5等)时,您应该使用数组来代替。

  4. 您在方法使用了一个数组init()。但是,您已将其声明为局部变量。这意味着您的其他方法都无法看到card您在此处声明的数组。您应该将其声明为成员变量,而不是card1, card2, card3等变量。您需要在paintComponent()方法中使用的任何其他变量也是如此,因为它只能有一个Graphics g参数。

  5. 您不需要paintComponent()显式调用。事实上,你不应该明确地调用它。系统将在适当的时候调用此方法。

我希望这有助于澄清几点。祝您的 Java 体验好运。如果您还有其他问题,请告诉我们。

于 2012-09-08T22:58:50.617 回答
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 处理,它实际上选择图形上下文,并为我们调用我们的绘制函数。不过,如果你愿意,你可以传入任何你想要的图形对象,并要求它在上面绘制。(因此,如果您想将组件绘制到图像上,可以这样做)

于 2012-09-08T22:59:01.523 回答
1

根据 Java Graphics类的文档是抽象的,所以你不能实例化它。

于 2012-09-08T23:00:57.937 回答