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();ため、実行できません。) 通常、カスタム ペインティングを行うメソッドを拡張およびオーバーライドするクラスを作成します。そこから、参照を必要とする他のメソッドに参照を渡すことができます。GraphicsJPanelpaintComponent()Graphics

これを試してみてください。もちろん、私はかなり抽象的なレベルで話しています。これらのヒントから何を理解したかをお知らせください。そこから作業を進めます。

編集:

JComponent抽象メソッドを宣言しpaintComponent(Graphics g)ます。独自の実装を提供する場合は、このメソッド シグネチャを正確に一致させる必要があります。つまり、 1 つのパラメーター、つまりGraphicsオブジェクトのみが許可されます。

より多くの引数を持つメソッドを自由に作成できますpaintComponent()が、メソッド シグネチャが一致しないため、オペレーティング システムがアプレットを再描画する必要があると判断したときに、イベント ディスパッチ スレッドでメソッドが自動的に呼び出されることはありません。

そうは言っても、これを機能させるために拡張する必要はありませんJPanelJComponent祖先として順番に持つ任意のクラスを拡張できます。あなたの特定のケースで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。これは優先クラスです。AppletAWT との下位互換性のためにまだ存在しています。最近の Java アプレットはJApplet、代わりに Swing を使用します。

  2. コードをインデントするときは、タブではなくスペースを使用してください。タブは、システムに依存する方法で表示されます。これは、別のエディターまたは別のコンピューターでコードを表示すると、タブ形式のコードが意図したとおりに表示されない可能性があることを意味します。特に、この Web サイトがコードを適切にフォーマットしていないことがわかります。ほとんどのテキスト エディターには、タブをスペースに置き換える設定があります。自分でこれを行う方法を見つけることを強くお勧めします。

  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

ここには 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 によって処理されます。awt は実際にグラフィックス コンテキストを選択し、ペイント関数を呼び出します。ただし、必要に応じて、任意のグラフィックス オブジェクトを渡して、それに描画するように要求することができます。(したがって、コンポーネントを画像に描画したい場合は、それを行うことができます)

于 2012-09-08T22:59:01.523 に答える
1

Java Graphicsクラスのドキュメントによると、クラスは抽象的であるため、インスタンス化できません。

于 2012-09-08T23:00:57.937 に答える