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

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

ただいまの
回答率

89.53%

JLabelの表示内容を変更する方法

解決済

回答 4

投稿 編集

  • 評価
  • クリップ 0
  • VIEW 1,185

puroguraminng

score 15

JLabelの表示内容を変更する方法ありますか?

JPanelにaddしておいて、プログラムの処理で動的に内容を書き換えたいです。
JLabel作ってJPanelにaddすれば、設定できるのはわかるんですが、addしておいて書き換える方法を知りたいです。 
setTextを試してみたのですがコンソールこのような文字列が表示されました。イメージ説明
ソースコードは...
part18.java

public class part18
{
    public static void main(String[] args) throws java.io.IOException
    {
        new MyFrame();
    }
}

MyFrame.java

import java.awt.Color;
import java.awt.Font;
import java.awt.Image;
import java.awt.image.BufferedImage;

import javax.swing.ImageIcon;
import javax.swing.JFrame;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class MyFrame extends JFrame{
    JLabel jl;
    public MyFrame() throws java.io.IOException{
        setBounds( 975, 150, 940, 540);    //    フレームサイズを設定
        setDefaultCloseOperation( EXIT_ON_CLOSE);    //    閉じるボタン有効化
        add( createBasePanel() );    //    親パネルを作成し、フレームに貼り付け
        setVisible(true);    //    フレームを表示状態へ

        enableEvents( java.awt.AWTEvent.KEY_EVENT_MASK );
    }

    protected void processKeyEvent( java.awt.event.KeyEvent e ) {
        if( e.getID() == java.awt.event.KeyEvent.KEY_PRESSED) {
            System.out.println( "キー" + e.getKeyCode() + "が、押されたよ");
            jl.setText("キーがおされた");
            if( e.getKeyCode() == java.awt.event.KeyEvent.VK_SPACE) {
            System.out.println("スペースキーですね");
            }
        }

    }
    /**
     * 基盤パネルを作成
     */
    JPanel createBasePanel()  throws java.io.IOException{
        JPanel jp = createPanel(Color.BLACK );
        //    フォントを作成
        Font f = new Font(    Font.MONOSPACED,
                            Font.BOLD,
                               50 );

        //    レイアウト1行目
        //    パネルを作成し、親パネルに貼り付け
        JPanel jpChild = createPanel(Color.BLUE );
        jp.add( jpChild );
        //    ラベルを作成し、子パネルに貼り付け
        JLabel jlChild = new JLabel( Player.getStatusString() );
        jlChild.setFont( f );
        jlChild.setForeground( Color.WHITE );
        jpChild.add( jlChild );

        //    画像つきラベルを作成し、親パネルに貼り付け
        //java.awt.image.BufferedImage ii
        //= new javax.swing.ImageIcon("Character.jpg");

        //    レイアウト2行目
        //    パネルを作成し、親パネルに貼り付け
        JPanel jpChild2 = createPanel(Color.CYAN );
        jp.add( jpChild2 );
        //    選択肢をパネルに貼り付け
        JLabel jlMain = new JLabel("<html>1.魔王を倒しに行く<br>2.修行する<br>3.宿屋に泊まる");
        jlMain.setFont( f );
        jpChild2.add( jlMain );
        /*
        //    モンスターをパネルに貼り付け
        File file = new File("Character.jpg");  //    ファイルを開く
        BufferedImage ba = ImageIO.read( file );//    画像全体を読み込む

        int cw = 48;    //    セルサイズ・幅
        int ch = 48;    //    セルサイズ・高さ
        int sw = cw*4;    //    表示サイズ・幅
        int sh = ch*4;    //    表示サイズ・高さ

        putMonster( jpChild2, ba, 3, 0, cw, ch, sw, sh);    //    モンスター    3-0 表示
        putMonster( jpChild2, ba, 9, 0, cw, ch, sw, sh);    //    モンスター    9-0 表示
        putMonster( jpChild2, ba, 0, 0, cw, ch, sw, sh);    //    モンスター    0-0 表示
        putMonster( jpChild2, ba, 0, 4, cw, ch, sw, sh);    //    モンスター    0-4 表示
        */

        //    レイアウト3行目
        //    ラベルを作成し、親パネルに貼り付け
        JLabel jl = new JLabel();
        jl.setText("魔王が世界を滅ぼそうとしています");
        jl.setFont( f );
        jl.setForeground( new Color( 255, 128, 0) );
        jp.add( jl );

        return( jp );
    }

    /**
     * パネルを作成し、背景色を設定します。
     */
    static JPanel createPanel ( Color c ){
        JPanel jp = new JPanel();
        jp.setBackground( c );
        return( jp );
    }
    /**
     *    モンスターを表示します。
     *
     * @param jpChild2  表示対象パネル
     * @param ba        画像全体
     * @param x            表示するセル座標X
     * @param y            表示するセル座標Y
     * @param cx         セルの大きさ・幅
     * @param cy         セルの大きさ・高さ
     * @param sw        表示サイズ・幅
     * @param sh        表示サイズ・高さ
     */
    static void putMonster( JPanel jpChild2, BufferedImage ba, 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(cw, ch);                //    画像部品サイズを設定
        jpChild2.add( jlImage );                //    画像を貼り付け
    }
}


Player.java

public class Player {
  static String name = "すけさん";
  static int lv = 30;           //プレイヤーのレベル
  static int hp = 30;           //プレイヤーのHP
  static double gold=50.0;        //プレイヤーの所持金

  public static String getStatusString()
      {
          return("  "+name + " LV" + lv + "  HP" + hp + "  "+gold+"G");
      }
}


環境はjava8 windows8.1です。

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

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

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

    クリップを取り消します

  • 良い質問の評価を上げる

    以下のような質問は評価を上げましょう

    • 質問内容が明確
    • 自分も答えを知りたい
    • 質問者以外のユーザにも役立つ

    評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

    質問の評価を上げたことを取り消します

  • 評価を下げられる数の上限に達しました

    評価を下げることができません

    • 1日5回まで評価を下げられます
    • 1日に1ユーザに対して2回まで評価を下げられます

    質問の評価を下げる

    teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

    • プログラミングに関係のない質問
    • やってほしいことだけを記載した丸投げの質問
    • 問題・課題が含まれていない質問
    • 意図的に内容が抹消された質問
    • 過去に投稿した質問と同じ内容の質問
    • 広告と受け取られるような投稿

    評価が下がると、TOPページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

    質問の評価を下げたことを取り消します

    この機能は開放されていません

    評価を下げる条件を満たしてません

    評価を下げる理由を選択してください

    詳細な説明はこちら

    上記に当てはまらず、質問内容が明確になっていない質問には「情報の追加・修正依頼」機能からコメントをしてください。

    質問の評価を下げる機能の利用条件

    この機能を利用するためには、以下の事項を行う必要があります。

回答 4

check解決した方法

0

最初に宣言しているjlに代入したつもりだったのですが、createBacePanel内で、また新しく宣言してしまっていたようです。ご回答してくださった方ありがとうございます

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

0

まずコードを張りましょう。
で、エラーは推測ですが、その行数のロジックの変数がnullになっているとしか
ソースがないといえません。

投稿

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

  • 2018/09/23 20:47

    コードを追加しました。

    キャンセル

0

JPanel createBasePanel()  throws java.io.IOException{
    ...

    JLabel jl = new JLabel();
    ...
}

このjlはcreateBasePanel内のローカル変数であって、
クラスMyFrameのフィールドjlとは同名ながら異なるものです。

次のように変更してみてください。

JPanel createBasePanel()  throws java.io.IOException{
    ...

    this.jl = new JLabel();    // this. は省略可
    ...
}

あるいは、宣言時に初期化してしまっても良いです。

public class MyFrame extends JFrame{
    // privateにしないと同一パッケージからいじり放題になってしまう
    private JLabel jl = new JLabel();

    ...
}

投稿

編集

  • 回答の評価を上げる

    以下のような回答は評価を上げましょう

    • 正しい回答
    • わかりやすい回答
    • ためになる回答

    評価が高い回答ほどページの上位に表示されます。

  • 回答の評価を下げる

    下記のような回答は推奨されていません。

    • 間違っている回答
    • 質問の回答になっていない投稿
    • スパムや攻撃的な表現を用いた投稿

    評価を下げる際はその理由を明確に伝え、適切な回答に修正してもらいましょう。

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

  • ただいまの回答率 89.53%
  • 質問をまとめることで、思考を整理して素早く解決
  • テンプレート機能で、簡単に質問をまとめられる

同じタグがついた質問を見る