###前提・実現したいこと
JAVAプログラムをNetBeansで作っています。
JFrameにラベルを配置しました。
このラベルのテキストを他のクラスから変えるにはどうしたら良いでしょうか。
JAVA
1NewJFrame.jLabel1.setText("変更");
単純にこれだけではダメなのでしょうか。
私はVBしかできず、会社でJAVAで作れと言われ途方にくれております。
どうぞよろしくお願い致します。
気になる質問をクリップする
クリップした質問は、後からいつでもMYページで確認できます。
またクリップした質問に回答があった際、通知やメールを受け取ることができます。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
回答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
総合スコア35668
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
総合スコア18400
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
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}
投稿2018/01/04 14:59
編集2018/01/04 15:31総合スコア5846
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
あなたの回答
tips
太字
斜体
打ち消し線
見出し
引用テキストの挿入
コードの挿入
リンクの挿入
リストの挿入
番号リストの挿入
表の挿入
水平線の挿入
プレビュー
質問の解決につながる回答をしましょう。 サンプルコードなど、より具体的な説明があると質問者の理解の助けになります。 また、読む側のことを考えた、分かりやすい文章を心がけましょう。
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。