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

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

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

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

Java

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

Q&A

3回答

7186閲覧

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

NaomiKanbe

総合スコア6

JFrame

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

Java

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

0グッド

1クリップ

投稿2018/01/04 02:33

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

JAVA

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

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

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

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

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

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

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

guest

回答3

0

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

Java

1class Hoge { 2 private final JLabel label; 3 4 Hoge(JFrame frame) { 5 this.label = frame.getMainLabel(); 6 ... 7 } 8 void fuga(String str) { 9 label.setText(str); 10 } 11 12 ... 13}

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

投稿2018/01/04 03:40

LouiS0616

総合スコア35660

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

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

0

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

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

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

例:

java

1class NewFrame extends JFrame { 2 public static void main(String[] args) { 3 new NewFrame().setVisible(true); 4 } 5 6 JLabel label1 = new JLabel(""); 7 JButton button = new JButton("button"); 8 9 NewFrame() { 10 super("window title"); 11 getContentPane().add(label1, BorderLayout.CENTER); 12 getContentPane().add(button, BorderLayout.SOUTH); 13 14 button.addActionListener(new MyHandler(this)); // NewFrameのインスタンスを渡す 15 ... 16 17 pack(); 18 } 19} 20 21class MyHandler implements ActionListener { 22 NewFrame frame; 23 24 // MyHandlerのインスタンスに、アクセス先のNewFrameのインスタンスを 25 // 覚えておく例。 26 MyHandler(NewFrame frame) { 27 this.frame; 28 } 29 30 @Override 31 public void actionPerformaed(ActionEvent ev) { 32 NewFrame.label1.setText("xxx"); // NG 33 frame.label1.setText("xxx"); // OK 34 } 35}

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

frame.label1.setText("xxx");

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


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

NewFrame.label1.setText("xxx");

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

投稿2018/01/04 03:36

KSwordOfHaste

総合スコア18394

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

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

0

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

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

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

Java

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

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

Java

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

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

Java

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

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

Java

1 2import java.beans.PropertyChangeListener; 3import java.beans.PropertyChangeEvent; 4import java.util.Random; 5/* 6 * To change this license header, choose License Headers in Project Properties. 7 * To change this template file, choose Tools | Templates 8 * and open the template in the editor. 9 */ 10/** 11 * 12 * @author umyu 13 */ 14public class NewJFrame extends javax.swing.JFrame implements PropertyChangeListener { 15 16 /** 17 * Creates new form NewJFrame 18 */ 19 public NewJFrame() { 20 initComponents(); 21 } 22 23 /** 24 * This method is called from within the constructor to initialize the form. 25 * WARNING: Do NOT modify this code. The content of this method is always 26 * regenerated by the Form Editor. 27 */ 28 @SuppressWarnings("unchecked") 29 // <editor-fold defaultstate="collapsed" desc="Generated Code"> 30 private void initComponents() { 31 32 jLabel1 = new javax.swing.JLabel(); 33 jButton1 = new javax.swing.JButton(); 34 35 setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 36 37 jLabel1.setText("jLabel1"); 38 39 jButton1.setText("jButton1"); 40 jButton1.addActionListener(new java.awt.event.ActionListener() { 41 public void actionPerformed(java.awt.event.ActionEvent evt) { 42 jButton1ActionPerformed(evt); 43 } 44 }); 45 46 javax.swing.GroupLayout layout = new javax.swing.GroupLayout(getContentPane()); 47 getContentPane().setLayout(layout); 48 layout.setHorizontalGroup( 49 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 50 .addGroup(layout.createSequentialGroup() 51 .addGroup(layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 52 .addGroup(layout.createSequentialGroup() 53 .addGap(72, 72, 72) 54 .addComponent(jLabel1)) 55 .addGroup(layout.createSequentialGroup() 56 .addGap(158, 158, 158) 57 .addComponent(jButton1))) 58 .addContainerGap(159, Short.MAX_VALUE)) 59 ); 60 layout.setVerticalGroup( 61 layout.createParallelGroup(javax.swing.GroupLayout.Alignment.LEADING) 62 .addGroup(layout.createSequentialGroup() 63 .addGap(73, 73, 73) 64 .addComponent(jLabel1) 65 .addGap(55, 55, 55) 66 .addComponent(jButton1) 67 .addContainerGap(131, Short.MAX_VALUE)) 68 ); 69 70 pack(); 71 }// </editor-fold> 72 73 private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) { 74 75 OtherClass Other = new OtherClass(this); 76 Other.setText(); 77 } 78 79 /** 80 * @param args the command line arguments 81 */ 82 public static void main(String args[]) { 83 /* Set the Nimbus look and feel */ 84 //<editor-fold defaultstate="collapsed" desc=" Look and feel setting code (optional) "> 85 /* If Nimbus (introduced in Java SE 6) is not available, stay with the default look and feel. 86 * For details see http://download.oracle.com/javase/tutorial/uiswing/lookandfeel/plaf.html 87 */ 88 try { 89 for (javax.swing.UIManager.LookAndFeelInfo info : javax.swing.UIManager.getInstalledLookAndFeels()) { 90 if ("Nimbus".equals(info.getName())) { 91 javax.swing.UIManager.setLookAndFeel(info.getClassName()); 92 break; 93 } 94 } 95 } catch (ClassNotFoundException ex) { 96 java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 97 } catch (InstantiationException ex) { 98 java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 99 } catch (IllegalAccessException ex) { 100 java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 101 } catch (javax.swing.UnsupportedLookAndFeelException ex) { 102 java.util.logging.Logger.getLogger(NewJFrame.class.getName()).log(java.util.logging.Level.SEVERE, null, ex); 103 } 104 //</editor-fold> 105 106 /* Create and display the form */ 107 java.awt.EventQueue.invokeLater(new Runnable() { 108 public void run() { 109 new NewJFrame().setVisible(true); 110 } 111 }); 112 } 113 114 @Override 115 public void propertyChange(PropertyChangeEvent e) { 116 jLabel1.setText((String)e.getNewValue()); 117 } 118 119 class OtherClass { 120 private PropertyChangeListener listener; //listenerの参照は不要になったタイミングでnullを入れるほうがイベントハンドラのリークを防げます。 121 private final Random rnd = new Random(); 122 OtherClass(PropertyChangeListener listener){ 123 this.listener = listener; 124 } 125 void setText() { 126 String text = "Hello" + String.valueOf(rnd.nextInt(500)); 127 PropertyChangeEvent event = new PropertyChangeEvent(this, "setText", text, text); 128 this.listener.propertyChange(event); 129 } 130 } 131 // Variables declaration - do not modify 132 private javax.swing.JButton jButton1; 133 private javax.swing.JLabel jLabel1; 134 // End of variables declaration 135}

□参考情報
PropertyChangeListener
PropertyChangeEvent

投稿2018/01/04 14:59

編集2018/01/04 15:31
umyu

総合スコア5846

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

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

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

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

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

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問