2012-03-29 29 views
3

私は何をしようとしているのは、私のJLabelのテキストを別のクラスから編集することです。私はlabel.setText( "bla bla")でそれを行います。私のJLabelには影響しません。別のクラスからJLabelテキストを編集する

GUIクラスで私のコードは、このような何かをlookes:

public class GUI { 

    JFrame f1 = new JFrame("GUI"); 
    JLabel l1 = new JLabel("Output"); 
    JTextField tf1 = new JTextField(""); 

    public run(){ // main calls this method. 

    Listener listener = new Listener(); 

    f1.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
    f1.setBounds(450, 170, 400, 400); 
    f1.setVisible(true); 
    f1.setResizable(false); 
    f1.setLayout(null); 

    l1.setBounds(8, 8, 200, 30); 
    listener.listen(tf1); 

    f1.add(l1); 
    } 
} 

し、私は、ユーザーの入力に応じて、JLabelのに変更を加えることになっているこのリスナークラスを持っています。コードは次のとおりです。

メソッドeverythingOKは完全に機能します。あなたはその1つを信頼する必要があります。 JLabelを静的なものとして定義すると動作しますが、初めて動作します。最初の変更後、JLabelに変更が表示されなくなりました。静的な定義は私を助けません。このコードに何が間違っているかを知っている人がいることを願っています。私は非常に長いコードの最も重要な部分だけを取ったので、明らかな間違いがあるかどうか気にしないでください。

ありがとうございます。

public boolean everythingOK() { 
     if (hasInt(tf1) && isValid(tf1)) { 
      return true; 
     } else { 
      return false; 
     } 
    } 

    public boolean hasInt(JTextField textfield) { 
     try { 
      Integer.parseInt(textfield.getText()); 
      return true; 
     } catch (NumberFormatException e) { 
      return false; 
     } 
    } 

    public boolean isValid(JTextField textfield) { 
     if (hasInt(textfield)) { 
      if (Integer.parseInt(textfield.getText()) >= minValue && Integer.parseInt(textfield.getText()) <= maxValue) { 
       return true; 
      } else { 
       return false; 
      } 

     } else { 
      return false; 
     } 

    } 
+0

「最初の変更後、JLabelに変更は表示されません」 - 「すべて」が「OK」で、同じテキストがJlabelに毎回表示されている可能性がありますか? –

+0

2回の呼び出しの間に 'everythingOK()'が変更されていますか? – GETah

+0

OK今度は私の投稿をeverythingOKのコードで更新しました –

答えて

3

リスナクラスは、GUIの別のインスタンスを作成します。

は、ここに私のeverythingOKコードです。

GUI gui = new GUI(); 

Listener.test()のコードは、Guiインスタンスのl1ラベルを変更し、表示されるGuiではなく変更します。

実際のGuiオブジェクトへの参照をリスナーに与える必要があります。

SwingUtilities.invokeLaterに新しいラベルを設定するコードをラップして、イベントディスパッチスレッドから実行されるようにする必要があります。

SwingUtilities.invokeLater(new Runnable() { 
    public void run() { 
     <guiInstance>.l1.setText("Query: " + queryNo); 
    } 
    }); 

UPDATE:ここ が何をしたいんサンプルコードです。あなたはそのままそれを持って遊ぶことができます。 GUIクラスがそれを作成するときにリスナーに独自のインスタンスを与える方法を見てください(新しいListener(this))。テキストフィールドにテキストが含まれている場合はラベルに "No errors"と表示されます。 SwingUtilities.invokeLaterの部分はこの場合は本当に必要ではありませんが、あなたのプログラムをさらに開発し、UIを更新したいバックグラウンドスレッドを追加し始めたら、このようにする必要があります。

import javax.swing.*; 
import javax.swing.event.DocumentEvent; 
import javax.swing.event.DocumentListener; 
import java.awt.*; 

public class GUI { 

    JFrame f1 = new JFrame("GUI"); 
    JLabel l1 = new JLabel("Output"); 
    JTextField tf1 = new JTextField(""); 

    public void run(){ // main calls this method. 
     f1.setDefaultCloseOperation(javax.swing.WindowConstants.EXIT_ON_CLOSE); 
     f1.setBounds(450, 170, 400, 400); 
     f1.setVisible(true); 
     f1.setResizable(false); 
     f1.setLayout(new GridLayout(2,1)); 

     f1.add(l1); 
     f1.add(tf1); 

     f1.pack(); 

     Listener listener = new Listener(this); 
     listener.listen(tf1); 
    } 

    public static void main(String[] args) { 
     new GUI().run(); 
    } 

    public boolean everythingOK() { 
     return tf1.getText().length() > 0; 
    } 

    class Listener { 
     private GUI gui; 

     public Listener(GUI gui) { 
      this.gui = gui; 
     } 

     public void listen(final JTextField textfield) { 

      textfield.getDocument().addDocumentListener(new DocumentListener() { 

       public void changedUpdate(DocumentEvent e) { test(); } 
       public void removeUpdate(DocumentEvent e) { test(); } 
       public void insertUpdate(DocumentEvent e) { test(); } 

       public void test() { 
        SwingUtilities.invokeLater(new Runnable() { 
         public void run() { 
          if (gui.everythingOK()) { // everythingOK is just a boolean that test if input is valid number and returns true if it is. 
           gui.l1.setText("No errors."); // this code is supposed to change JLabels text. 
          } else { 
           gui.l1.setText("Error."); // this code is supposed to change JLabels text. 
          } 
         } 
        }); 
       } 
      }); 
     } 
    } 
} 
+0

実際のGuiオブジェクトへの参照はどのようにして得られますか?私はSwingUtilitiesをとてもうまく利用していません。 –

+0

あなたのコードをテストしたので、完璧に動作します。今すぐ自分のコードに参加する方法を理解する必要があります:Dありがとう。 –

+0

大丈夫、幸運! – stolzem

関連する問題