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

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

ただいまの
回答率

91.26%

  • Java

    10836questions

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

  • JFrame

    17questions

    JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。

他のクラスからJFrameのラベルのテキストを変更

受付中

回答 3

投稿

  • 評価
  • クリップ 0
  • VIEW 89

NaomiKanbe

score 0

前提・実現したいこと

JAVAプログラムをNetBeansで作っています。
JFrameにラベルを配置しました。
このラベルのテキストを他のクラスから変えるにはどうしたら良いでしょうか。

NewJFrame.jLabel1.setText("変更");

単純にこれだけではダメなのでしょうか。
私はVBしかできず、会社でJAVAで作れと言われ途方にくれております。
どうぞよろしくお願い致します。

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

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

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

    クリップを取り消します

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

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

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

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

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

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

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

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

    質問の評価を下げる

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

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

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

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

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

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

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

    詳細な説明はこちら

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

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

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

回答 3

+2

推察でコメントしますがおそらくは多くの「オブジェクト指向の初心者の方」が陥る点なので多分当たらずとも遠からずのポイントを指摘していることになると思います。

javaではクラスのないプログラムは書けませんが、そのため「オブジェクト指向の基礎を把握する前に、とりあえずおまじないとしてclassって書く」と考えた方は多いのではないでしょうか。そうしたとしてもhello world的なプログラムならとりあえず動かせます。

しかしswingでプログラミングしようとするとどうしても「オブジェクト指向の基礎の部分」を把握しておく必要がでてきます。基礎とは「クラスとインスタンスが何か」と把握することです。

例:

class NewFrame extends JFrame {
  public static void main(String[] args) {
    new NewFrame().setVisible(true);
  }

  JLabel label1 = new JLabel("");
  JButton button = new JButton("button");

  NewFrame() {
    super("window title");  
    getContentPane().add(label1, BorderLayout.CENTER);
    getContentPane().add(button, BorderLayout.SOUTH);

    button.addActionListener(new MyHandler(this)); // NewFrameのインスタンスを渡す
    ...

    pack();
  }
}

class MyHandler implements ActionListener {
  NewFrame frame;

  // MyHandlerのインスタンスに、アクセス先のNewFrameのインスタンスを
  // 覚えておく例。
  MyHandler(NewFrame frame) {
    this.frame;
  }

  @Override
  public void actionPerformaed(ActionEvent ev) {
     NewFrame.label1.setText("xxx");  // NG
     frame.label1.setText("xxx");     // OK
  }
}

上記コードで「どれがインスタンスに対するフィールドやメソッドなのか」を知っておく必要があります。簡単に言えばstaticがついてないものがインスタンスフィールド、インスタンスメソッドになります。
インスタンスフィールドlabel1は「NewFrameの特定のインスタンスに紐づくもの」なので、アクセスするには「インスタンス」が分かっていなければなりません。インスタンスがframeという変数に入っていたなら

frame.label1.setText("xxx");

などと書けます。NewFrameクラスのメソッドであろうが他のクラスにあるメソッドであろうが事情は同じでNewFrameのインスタンスを、なんらかの方法で知る必要があるのです。


上記のlabel1フィールドをstaticにすると

NewFrame.label1.setText("xxx");

のように「どの場所からでも」直接アクセスできます。NewFrameはアプリケーション内でインスタンスはどのみち1個しかできないため、インスタンスフィールド(staticなしのフィールド)でもstaticフィールドでもどちらもでよいといえばよいのですが、本来はインスタンスフィールドとして定義すべきだと思いますのでstaticを付けてしまうことはお勧めしません。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

+2

『他のクラス』からJLabelのインスタンスを参照可能である必要があります。
例えば、こんな感じです。

class Hoge {
    private final JLabel label;

    Hoge(JFrame frame) {
        this.label = frame.getMainLabel();
        ...
    }
    void fuga(String str) {
        label.setText(str);
    }

    ...
}

適当に継ぎ足すとひどいコードになることが予想されますのでご注意を。

投稿

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

0

他の回答者様によって解決内容が既に出ているので少し違ったアプローチの回答を致します。

他のクラスがJFrameを継承したクラスの内部実装(JLabel)について詳しいのはクラス間の結合度が高いのであまり好ましくないかと。
あるクラスに対して内部の値を変更したい時は、該当のクラスに対してイベントとして通知する形にして、通知側のクラスが値を変更するという形の方が個人的に好きです。

1,NewJFrameクラスはPropertyChangeListener を実装する。

import java.beans.PropertyChangeListener;
public class NewJFrame extends javax.swing.JFrame implements PropertyChangeListener {


2,propertyChangeイベントイベント内で、jLabel1.setTextの処理を行う。

    @Override
    public void propertyChange(PropertyChangeEvent e) {
        jLabel1.setText((String)e.getNewValue());
    }

3,他クラス側でNewJFrameに対してpropertyChangeイベントを発火する。

import java.beans.PropertyChangeEvent;
    class OtherClass {
        private PropertyChangeListener listener; //listenerの参照は不要になったタイミングでnullを入れるほうがイベントハンドラのリークを防げます。
        private final Random rnd = new Random();
        OtherClass(PropertyChangeListener listener){
            this.listener = listener;
        }
        void setText() {
            String text = "Hello" + String.valueOf(rnd.nextInt(500));
            PropertyChangeEvent event = new PropertyChangeEvent(this, "setText", text, text);
            this.listener.propertyChange(event);
        }
    }


以下はnetbeansで作ったサンプルソースコードです。ご参考まで

import java.beans.PropertyChangeListener;
import java.beans.PropertyChangeEvent;
import java.util.Random;
/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
/**
 *
 * @author umyu
 */
public class NewJFrame extends javax.swing.JFrame implements PropertyChangeListener {

    /**
     * Creates new form NewJFrame
     */
    public NewJFrame() {
        initComponents();
    }

    /**
     * This method is called from within the constructor to initialize the form.
     * WARNING: Do NOT modify this code. The content of this method is always
     * regenerated by the Form Editor.
     */
    @SuppressWarnings("unchecked")
    // <editor-fold defaultstate="collapsed" desc="Generated Code">                          
    private void initComponents() {

        jLabel1 = new javax.swing.JLabel();
        jButton1 = new javax.swing.JButton();

        setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE);

        jLabel1.setText("jLabel1");

        jButton1.setText("jButton1");
        jButton1.addActionListener(new java.awt.event.ActionListener() {
            public void actionPerformed(java.awt.event.ActionEvent evt) {
                jButton1ActionPerformed(evt);
            }
        });

        javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane());
        getContentPane().setLayout(layout);
        layout.setHorizontalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
                    .addGroup(layout.createSequentialGroup()
                        .addGap(72, 72, 72)
                        .addComponent(jLabel1))
                    .addGroup(layout.createSequentialGroup()
                        .addGap(158, 158, 158)
                        .addComponent(jButton1)))
                .addContainerGap(159, Short.MAX_VALUE))
        );
        layout.setVerticalGroup(
            layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING)
            .addGroup(layout.createSequentialGroup()
                .addGap(73, 73, 73)
                .addComponent(jLabel1)
                .addGap(55, 55, 55)
                .addComponent(jButton1)
                .addContainerGap(131, Short.MAX_VALUE))
        );

        pack();
    }// </editor-fold>                        

    private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {                                         

        OtherClass Other = new OtherClass(this);
        Other.setText();
    }                                        

    /**
     * @param args the command line arguments
     */
    public static void main(String args[]) {
        /* Set the Nimbus look and feel */
        //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) ">
        /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel.
         * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 
         */
        try {
            for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) {
                if ("Nimbus".equals(info.getName())) {
                    javax.swing.UIManager.setLookAndFeel(info.getClassName());
                    break;
                }
            }
        } catch (ClassNotFoundException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (InstantiationException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (IllegalAccessException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        } catch (javax.swing.UnsupportedLookAndFeelException ex) {
            java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex);
        }
        //</editor-fold>

        /* Create and display the form */
        java.awt.EventQueue.invokeLater(new Runnable() {
            public void run() {
                new NewJFrame().setVisible(true);
            }
        });
    }

    @Override
    public void propertyChange(PropertyChangeEvent e) {
        jLabel1.setText((String)e.getNewValue());
    }

    class OtherClass {
        private PropertyChangeListener listener;  //listenerの参照は不要になったタイミングでnullを入れるほうがイベントハンドラのリークを防げます。
        private final Random rnd = new Random();
        OtherClass(PropertyChangeListener listener){
            this.listener = listener;
        }
        void setText() {
            String text = "Hello" + String.valueOf(rnd.nextInt(500));
            PropertyChangeEvent event = new PropertyChangeEvent(this, "setText", text, text);
            this.listener.propertyChange(event);
        }
    }
    // Variables declaration - do not modify                     
    private javax.swing.JButton jButton1;
    private javax.swing.JLabel jLabel1;
    // End of variables declaration                   
}

□参考情報

PropertyChangeEvent

投稿

編集

  • 回答の評価を上げる

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

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

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

  • 回答の評価を下げる

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

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

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

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

ただいまの回答率

91.26%

関連した質問

  • 解決済

    javaのGUIのレイアウトについて

    自作のターン制バトル型のゲームの画面を作っています。mainScreen.javeのJFrameのJPanelに別のクラスJobSelectのボタンなどを追加したいのですがやり方が

  • 受付中

    [java]TextFieldの中身を引数として持ってくる場合

    [java]TextFieldの中身を引数として持ってくる場合どうしたらよいですか? TextFieldに書かれた文字をボタンが押されたら一時的に保存されるという風にしたいのです

  • 解決済

    javaでのkey入力によるbutton点滅方法について。追記

    疑問、問題 前回の質問でいろいろしったのでまた新しく質問を書きなおさせていただきます。また、コードを全文のせた方がいいとのご指摘もあったのでそうさせていただきます。 問題ですが

  • 解決済

    JFrameでのJPanelの切り替えについて

    前提・実現したいこと (例)Java(UIはJFrame)でゲームを作っているのですが、JPanelの切り替えをJFrameで行おうとしています。 しかし、JPanelの切り替

  • 受付中

    数当てゲームを制作したのですが、全くゲームにならないのです。

    前提・実現したいこと 数当てゲームに簡単なパネルをつけたいのですが、、、 ・精製した乱数がゲーム中保持されない ・10 回ゲームオーバーの表示が出るよう書いているがゲームが終わらな

  • 解決済

    JAVAのエラーの解決方法がわからないです

    Javaの質問で以下のプログラムをコマンドプロントでコンパイルすると コンパイルは通るのですが実行してテンキーじゃない1や2や3を押した時に 以下のエラーが出ます どうしたらい

  • 解決済

    thisの意味が分かりません。

    前提・実現したいこと プログラミング初心者です。 Javaで電卓を作っています。 コードの一番下の三行のthisというのは継承しているJFrameクラスのことを指しているのでしょう

  • 解決済

    JFrame ウィンドウサイズの変更

    前提・実現したいこと java言語でウィンドウサイズを標準サイズにしたい。 例えば、C#でいうformのautosize=trueみたいな感じで。。。 import jav

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

  • Java

    10836questions

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

  • JFrame

    17questions

    JFrameはJFC/Swingフレームワークのコンポーネントであり、トップレベルのコンテナです。