質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.48%
Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

Q&A

1回答

1309閲覧

JPanelに貼り付けできないです

vi_vi

総合スコア8

Java

Javaは、1995年にサン・マイクロシステムズが開発したプログラミング言語です。表記法はC言語に似ていますが、既存のプログラミング言語の短所を踏まえていちから設計されており、最初からオブジェクト指向性を備えてデザインされています。セキュリティ面が強力であることや、ネットワーク環境での利用に向いていることが特徴です。Javaで作られたソフトウェアは基本的にいかなるプラットフォームでも作動します。

0グッド

0クリップ

投稿2018/11/11 03:22

import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;
import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.io.File;
import java.awt.image.BufferedImage;
import javax.imageio.ImageIO;
import javax.swing.ImageIcon;

public class part20
{

static java.awt.image.BufferedImage ba ;
static JPanel jp;
static JPanel jpChild2;

public static void main( String[] args )throws java.io.IOException { System.out.println("ヤッホー"); // ウインドウフレームを作成、表示 JFrame jf = new JFrame(); jf.setBounds( 20, 40, 940, 540 ); jf.setDefaultCloseOperation( JFrame.EXIT_ON_CLOSE ); // 親パネルを作成し、フレームに貼り付け jp = new JPanel ( new java.awt.GridLayout( 4, 1)); jp.setBackground( Color . BLACK ); jf.add( jp ); // フォントを作成 Font f = new Font( Font.SERIF, Font.BOLD, 50); // レイアウト1行目 // パネルを作成し、親パネルに貼り付け JPanel jpChild = new JPanel(); jpChild.setBackground( Color . RED ); jp.add( jpChild ); // ラベルを作成し、子パネルに貼り付け JLabel jlChild = new JLabel( "トンヌラ  Lv99 HP999/999" ); jlChild.setFont( f ); jlChild.setForeground( Color . WHITE ); jpChild.add( jlChild ); File file = new File("pipo-halloweenchara2016_26.png");//開く ba = ImageIO.read ( file ); //読み込む int cw = 32; int ch = 32; int sw = 200; int sh = 200; putMonster( 0, 0, cw, ch, sw, sh); // モンスターを表示 //レイアウト3行目 // パネルを作成し、親パネルに貼り付け JPanel jpChild2 = new JPanel(); jpChild2.setBackground( Color . CYAN ); jp.add( jpChild2 ); // ラベルを作成し、パネルに貼り付け JLabel jl = new JLabel( "魔王が世界を滅ぼそうとしています。" ); jl.setFont( f ); jl.setForeground( new Color ( 255, 128, 0) ); jp.add( jl ); jf.setVisible( true ); } /** モンスターを表示します * *   @param x 表示するセルの座標x * @param y 表示するセルの座標y * @param cw セルの大きさ・幅 * @param ch セルの大きさ・高さ * @param sw 表示サイズ・幅 * @param sh 表示サイズ・高さ */ static void putMonster(int x, int y, int cw, int ch, int sw, int sh ) { BufferedImage bs = ba.getSubimage (cw * x, ch * y, cw, ch ); Image im = bs.getScaledInstance( sw, sh, Image.SCALE_DEFAULT); ImageIcon ii = new ImageIcon ( im ); //JLabel用に変換 JLabel jlImage = new JLabel ( ii ); //画像部品を生成 jlImage.setSize ( sw, sh ); //画像サイズを設定 jp.add( jlImage ); //画像貼り付け }

}

前提・実現したいこと

JPanelに画像を貼り付けたいのですがエラーがでてしまいます。
99行目の jp.add( jlImage ); のjlImageを66行目のjp.add( jpChild2 );のjpChild2に貼り付けたいです。
■■な機能を実装中に以下のエラーメッセージが発生しました。
99行目の jp.add( jlImage );のjpをjpChild2にするとエラーがでます。

発生している問題・エラーメッセージ

エラーメッセージ Exception in thread"main"java.lang.NullPointerException at part20.putMonster(part20.java:99) at part20.main(part20.java:62)

該当のソースコード

jp.add( jlImage ); //画像貼り付け
jpをjpChild2にするとエラーになります。

試したこと

親パネルjpには子パネルは何枚も貼れます。
子パネルにはLabelは貼れます。

補足情報(FW/ツールのバージョンなど)

初心者なんで理由がわかりません。
よろしくおねがいします。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

m.ts10806

2018/11/11 04:06

ソースコードはマークダウンのcode機能を利用してください
guest

回答1

0

Java

static JPanel jpChild2;

Java

JPanel jpChild2 = new JPanel();

この二つのインスタンスは別物です。
前者はstaticフィールドであり、後者はメソッド内のローカル変数です。

次のようにコードを変更してください。

Java

1jpChild2 = new JPanel(); // 型を付けると、改めて変数を用意してしまう

ところで、static変数が多過ぎるように思います。
初心者の段階でstaticな要素をむやみに使うとオブジェクト指向が崩壊します

性質や用途をしっかり理解するまでは、あまり使わないことをお勧めします。

コードの書き方について

teratailには、コードを見やすく表示する機能があります。
質問編集画面を開き、コードを選択した状態で<code>ボタンを押してください。
Java

投稿2018/11/11 03:28

LouiS0616

総合スコア35660

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

vi_vi

2018/11/11 04:28

回答ありがとうございます。 インスタンスが別物になってしまうんですね。 変更しましたが同じ結果でした。 もう少し頑張ってみます。 有難うございました。
LouiS0616

2018/11/11 04:35

JPanelインスタンスを生成する前にputMonsterメソッドを呼んでいるからです。 単に順序の問題です。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.48%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問