|
分類:[.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を貼り付け
}
|