C# と VB.NET の質問掲示板

ASP.NET、C++/CLI、Java 何でもどうぞ

C# と VB.NET の入門サイト

Re[3]: どうしてもnullがはいってしまう。


(過去ログ 123 を表示中)

[トピック内 4 記事 (1 - 4 表示)]  << 0 >>

■73437 / inTopicNo.1)  どうしてもnullがはいってしまう。
  
□投稿者/ java初心者 (1回)-(2014/09/25(Thu) 18:37:34)

分類:[.NET 全般] 

皆様はじめまして。
長文失礼致します。
javaを習得しようと初めて、4日目になるものです。
現在こういったものを作成しようとしております。
1:window(フレームを作成)→2:フレームにパネルを作成(親パネル)→3:親パネルの上に画像や文字、子のパネル等を作成し貼り付けていく。

2までは順調に作成できたのですが、3の画像を貼り付けるところで、プログラム文が長くなり、メソッド化をしようとした所、画像の表示ができず、色々と悩んでおります。(どうしても画像を表示する際に使用している変数jpにNull値がはいってしまいます・・・)

コンパイラ時のエラー文:
Exception in thread "main" java.lang.NullPointerException
  at gazousyori.putMonster(gazyousyori.java70)
  at gazousyori.main(gazousyori.java60)

色々なサイトを閲覧し、対応策を考えましたが、自分ひとりでは手におえず、皆様がたのご助力をお願いしたく投稿させて頂きました。 よろしければ、皆様のご助力の程宜しくお願い致します。以下ソース

/*----------画像の切り取りの表示のメソッド化---------*/
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Font;
import java.awt.Color;
import java.io.File;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class gazousyori{

	static BufferedImage	b_all;
	static JPanel		jp;

	public static void main(String[] args) throws java.io.IOException{
	
		System.out.println("Hello");

		//windowフレームを作成、表示
		JFrame	jf = new JFrame();                                              //インスタンス化とjfのオブジェクト化
		jf.setBounds( 50, 100, 940, 800 );                                      //windowのサイズの設定
		jf.setVisible( true );                                                  //windowの表示
		jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE );                    //windowのxボタン有効化

		//【親】パネルを作成し、フレームに貼り付け
		JPanel	jp = new JPanel();                                              //パネルを新しく作成
		jp.setBackground( Color.BLACK );                                        //パネルの色を黒に設定
		jf.add( jp );                                                           //windowに黒色のパネルを貼り付け

		//ラベルを作成し、パネルに貼り付け
		JLabel	jl = new JLabel("将来的にはテロップ");                          //インスタンス化とjlのオブジェクト化

		Font f = new Font( Font.MONOSPACED,                                     //文字の大きさの設定:明朝体+太文字+斜体
                                   Font.BOLD |
                                   Font.ITALIC, 20 );
		jl.setFont( f );                                                        //文字の大きさの設定をjlに代入
		jl.setForeground( new Color( 255, 128, 0 ) );                           //文字色設定
		jp.add( jl );                                                           //親パネルに貼り付け

		//【子】パネルを作成し、【親】パネルに貼り付け
		JPanel jpChild = new JPanel();                                          //パネルを新しく作成
		jpChild.setBackground( Color.RED );                                     //パネルの色を黒に設定
		jp.add( jpChild );                                                      //【親】パネルに【子】パネルを貼り付け

		//ラベルを作成し、【子】パネルに貼り付け
		JLabel	jlChild = new JLabel("将来はステータスを表示");                 //インスタンス化とjlChildのオブジェクト化
		jlChild.setFont( f );                                                   //文字の大きさの設定をjlChildに代入
		jlChild.setForeground( Color.WHITE );                                   //文字色設定
		jpChild.add( jlChild );                                                 //【子】パネルjpに貼り付け

		File file = new File("vx_chara_4.png" );                                //File形式をfileにインスタンス化
		b_all = ImageIO.read( file );                                           //b_allに画像全体を読み込む

		int cx = 32;
		int cy = 32;

		putMonster( 0, 0, cx, cy );						//キャラクター表示
		putMonster( 1, 0, cx, cy );						//キャラクター表示
		putMonster( 2, 0, cx, cy );						//キャラクター表示
	}

	public static void putMonster( int x, int y, int cx, int cy ){
		BufferedImage	bshort = b_all.getSubimage( cx * x, cy * y, cx, cy );   //x0,y0,〜x32,y32までの画像をbshortに読込む
		ImageIcon	ii = new ImageIcon( bshort );                           //JLabel用に型変換
		JLabel jlImage = new JLabel( ii );                                      //jlImageにオブジェクトiiの画像を代入
		jlImage.setSize( cx, cy );                                              //画像のサイズを設定
		jp.add( jlImage );                                                      //親】パネルにjlImageを貼り付け
	}
}
----------------------------------------------------------------------------------------------------------------------------------
メソッドを作成せず、一つずつ画像を貼り付けた場合
gazousyoriクラスにある
	static BufferedImage	b_all;
	static JPanel		jp;
を削除し、mainコンストラクタのputMonster();を消す、
public static void putMonster( int x, int y, int cx, int cy ){
のメソッドを消し、mainコンストラクタの終了まえに以下を記述
{
		//getSubimageを使用したいので、以下^の手順を記述する。(部分を切るとる為の手段)
		File	file = new java.io.File("vx_chara_4.png" );			//File形式をfileにインスタンス化
		BufferedImage	b_all = ImageIO.read( file );				//インスタンス化したfileをBufferedImage b_allに画像全体を読み込む
		BufferedImage	bshort = b_all.getSubimage( 32 * 3, 0, 32, 32 );		//Subimagex0,y0,〜x32,y32までの画像をbshortに読み込む
		//JLabelが読み込めるものはIcon型なので、biをIcon型iiに読み込む必要がある
		ImageIcon	ii = new ImageIcon( bshort );				//JLabel用に型変換
		
		//JLabelが読み込めるIcon型に読みこんだので、JLabelの変数jlImageにiiを代入する。
		JLabel jlImage = new JLabel( ii );					//jlImageにオブジェクトiiの画像を代入
//		jlImage.setBounds( 10, 10, 320, 320 );					//画像のサイズを設定
		//setBoundsで最初のx,yが0,0で良い場合はsetSizeを使用する事が出来る。
		jlImage.setSize( 32, 32 );						//画像のサイズを設定
		jp.add( jlImage );							//【親】パネルにjlImageを貼り付け
		}

		{
		File	file = new java.io.File("vx_chara_4.png" );			//File形式をfileにインスタンス化
		BufferedImage	b_all = ImageIO.read( file );				//fileをBufferedImage ballに画像全体を読込
		BufferedImage	bshort = b_all.getSubimage( 32 * 4, 32 * 4, 32, 32 );	//x0,y0,〜x32,y32までの画像をbshortに読込
                ImageIcon	ii = new ImageIcon( bshort );				//JLabel用に型変換
		JLabel jlImage = new JLabel( ii );					//jlImageにオブジェクトiiの画像を代入
		jlImage.setSize( 32, 32 );						//画像のサイズを設定
		jp.add( jlImage );							//【親】パネルにjlImageを貼り付け
		}


引用返信 編集キー/
■73439 / inTopicNo.2)  Re[1]: どうしてもnullがはいってしまう。
□投稿者/ しま (84回)-(2014/09/25(Thu) 23:52:21)
No73437 (java初心者 さん) に返信
> javaを習得しようと初めて、4日目になるものです。
>
> コンパイラ時のエラー文:
> Exception in thread "main" java.lang.NullPointerException
> at gazousyori.putMonster(gazyousyori.java70)
> at gazousyori.main(gazousyori.java60)
>
これは実行時のエラー(例外が出た)について報告しています。
また、「コンパイラー」とはコンパイルするプログラムのことを指します。なのでコンパイラ時のエラーという表現は奇妙に聞こえます。

>public static void putMonster( int x, int y, int cx, int cy ){
>のメソッドを消し、mainコンストラクタの終了まえに以下を記述
mainコンストラクタとは何ですか?

> public class gazousyori{
>
> static BufferedImage b_all;
> static JPanel jp; <================================================================================(1)
>
> public static void main(String[] args) throws java.io.IOException{
>
>//----------------------------------------途中略--------------------------------
> //【親】パネルを作成し、フレームに貼り付け
> JPanel jp = new JPanel(); //パネルを新しく作成 <========(2)
> jp.setBackground( Color.BLACK ); //パネルの色を黒に設定
> jf.add( jp ); //windowに黒色のパネルを貼り付け
>
jp を2箇所で宣言していることは分りますか?
つまり、関数 main() 内の jp と gazousyori の static なメンバー jp とは別物だということは分りますか?
分らなければ、変数の通用範囲について調べてみてください。
このままでは、class gazousyori のメンバー jp は未定義な(値がない)ままなのでコンパイラーが親切に null にしてくれているおかげで
関数 putMonster() を呼出したところで、class gazousyori のメンバー jp の値が null だから実行時エラーが発生しているように見えます。
引用返信 編集キー/
■73441 / inTopicNo.3)  Re[2]: どうしてもnullがはいってしまう。
□投稿者/ java初心者 (2回)-(2014/09/26(Fri) 01:43:52)
しま 様
ご指摘の程、頂きまして有難うございました。
2つのjpの件、分りやすく説明して頂きありがとうございます。
おかげさまで、コンパイル時の例外(null値が入る)が解決いたしました。
引用返信 編集キー/
■73442 / inTopicNo.4)  Re[3]: どうしてもnullがはいってしまう。
□投稿者/ java初心者 (3回)-(2014/09/26(Fri) 01:45:31)
No73441 (java初心者 さん) に返信
> しま 様
> ご指摘の程、頂きまして有難うございました。
> 2つのjpの件、分りやすく説明して頂きありがとうございます。
> おかげさまで、コンパイル時の例外(null値が入る)が解決いたしました。

解決済みチェックを忘れましたので再度投稿させていただきました。
すみません。
解決済み
引用返信 編集キー/


トピック内ページ移動 / << 0 >>

このトピックに書きこむ

過去ログには書き込み不可

管理者用

- Child Tree -