2012-01-12 21 views
5

私はJavaの初心者です。私の最初のプロジェクトでは、私は独占ゲームを構築し始めました。Javaグラフィックの問題

私はグラフィックスメソッドを使用してSWINGにGUIを構築しています。

答えが見つからない2つの問題が発生しました。

最初の1つは、以前同じプロジェクトで別のJPanelで同じ方法で行っていたJPanelに背景色を設定できないようです。

画像を追加しようとしているうちにNullPointerExceptionが表示されます。try/catchでこのエラーを修正できましたが、グラフィックスはペイントされないようです。同じメソッドを使用して読み込みました以前のJPanelで画像を追加しても機能しました。

私の現在のJFrameには、3つの要素が別々のクラスにあり、BorderLayout()を使用して追加されています。

これは、問題を作成しているクラスのコードです:

public class MonopolyBoard extends JPanel{ 


    Image atlantic; 
    MonopolyBoard() { 
     this.setBorder(new EtchedBorder()); 

     this.setBackground(new Color((80), (180), (210))); //this code dosent work 

     //this throws exception without try catch 
     try{ 
     ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/Atlantic Ave.jpg")); 
     atlantic = a.getImage(); 
     } 
     catch(NullPointerException e){} 
     } 

    public void paint(Graphics g){ 

      } 
      Graphics2D g2 = (Graphics2D) g; 
     //this code should draw the image but it dosent 
      g2.drawImage(atlantic, 100, 100, null); 
      g.drawImage(atlantic, 100, 100, this); 

    }; 
} 
+0

が '試す/ catch'を使用しないでください。スタックトレースを送信します。 –

+4

"Swingプログラムは、' paint() 'をオーバーライドするのではなく' paintComponent() 'をオーバーライドする必要があります。" - [AWTとSwingのペイント:ペイントメソッド](http://java.sun.com/products/jfc/tsc/ articles/painting/index.html#コールバック)。 – trashgod

+0

"これはtry catchなしで例外をスローします" - これは間違っています。ブロックが例外をスローした場合、try/catchに関係なくブロックが例外をスローします。 try/catchブロックが実行するのは、その例外です。その結果、デバッグが不可能になりにくくなります。例外がスローされたことを理解し、ラグの下に隠すのではなく理解する必要があります。 – Mat

答えて

1

あなたはcatchブロック内スタックトレースを印刷しない限り、あなたが知ることができません。 new ImageIcon()のコンストラクターが例外をスローせず、代わりにヌルオブジェクトを返す場合は、nullオブジェクトに対してメソッドを呼び出すことができないため、次の行a.getImage()がNPEを引き起こします。代わりに、この

//this throws exception without try catch   
try 
{   
    ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
    atlantic = a.getImage();   
}   
catch(NullPointerException e){} 

この

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 
if (a == null) 
{ 
    System.out.println("Can not find AtlanticAve.jpg"); 
    return; 
} 
    atlantic = a.getImage();   

ライン基本的に

// the next line may be wrapped incorrectly due to MarkDown 
ImageIcon a = new ImageIcon(this.getClass().getResource("../Card/AtlanticAve.jpg")); 

を試してみてください、あなたはイメージアイコンを返すように場合、コンストラクタを引き起こすかもしれないものを見て開始する必要がありますnullオブジェクトです。それが正しい軌道に乗ります。失敗したgetResource()呼び出しのために何かが起きる可能性があります。見つけ出す簡単な方法は、上記の行をその部分に分割し、それらに独自の結果変数を与えることです。それは面倒で不十分ですが、トラブルシューティングが時々行われる方法です。

// using _var_ because I'm too lazy to look up the return types of the methods 
var x1 = this.getClass().getResource("../Card/AtlanticAve.jpg"); 
if (x1 == null) 
{ 
    System.out.println("Can't find my resource"); 
} 

あなたは)(

+0

イメージの問題を解決するために管理しました。イメージが正しいパッケージに置かれているようですが、残っている唯一の問題は、なぜバックグラウンドが設定されているかです。 – user1146440

1

私はあなたのコードと非常に混乱していますが、私は問題はあなたのパネルが!あなたのpaintメソッドを描画されていない、それがあるべきことだと思います

@Override 
public void paintComponent(Graphics g){ 
    Graphics2D g2 = (Graphics2D) g; 
    //this code should draw the image but it dosent 
    g2.drawImage(atlantic, 100, 100, null); 
    g.drawImage(atlantic, 100, 100, this); 
} 
+0

eclipseを使用していますか?あなたがすべきでなければ、それは多くの問題を持つことからあなたを止めるべきです:)楽しい時を過す! –

+0

私はNetbeansを使用しています。それは、私が持っている唯一の問題は、今例外を取得していた理由は、右のパッケージthatsのイメージwasentを描く私の悪いことでした – user1146440

+0

私ができる唯一の理由私が投稿した答えは、あなたのペイント方法では何も呼び出されていないことを見てください。上記の答えは、 –

1

はあなたがペンキを上書きするため、背景色がどんな効果を持っていない設定画像を取得します。 ペイントは背景を描画します。

あなたのpaintメソッドでバックグラウンドをペイントする必要があります。

public void paint(Graphics g){ 
    // paint the background 
    g.fill(); // not sure about the parameters 
    // paint your image 
    g.drawImage(...); 
} 
+0

これは問題でした – user1146440