2012-03-29 111 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這個監聽器類。這裏是代碼:

public class Listener { 

    GUI gui = new 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() { 
       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. 
       } 
      } 
     }); 
    } 
} 

方法everythingOK完美的作品,你只需要相信我那一個。如果我將JLabel定義爲靜態,它將起作用,但它只能第一次運行。第一次更改之後,JLabel中沒有出現更多更改,因此將其定義爲static對我沒有幫助。我希望有人知道這段代碼有什麼問題。不要介意是否存在明顯的錯誤,因爲我只採用非常長的代碼中最重要的部分。

在此先感謝。

這裏是我的everythingOK代碼:

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中」 - 可能是因爲「everything」是「OK」,並且Jlabel中每次都出現相同的文本? – 2012-03-29 20:13:44

+0

你確定'everythingOK()'在每兩次調用之間改變嗎? – GETah 2012-03-29 20:18:43

+0

好吧,現在我更新了我的帖子,代碼爲everythingOK() – 2012-03-29 20:22:36

回答

3

監聽器類創建桂的另一個實例。

GUI gui = new GUI(); 

Listener.test()中的代碼更改了它的Gui實例中的l1標籤,而不是顯示的Gui。

您必須爲Listener提供對真實Gui對象的引用。

您可能還需要在SwingUtilities.invokeLater中包裝設置新標籤的代碼,以便它可以從事件派發線程執行。

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

UPDATE: 下面是示例代碼,你想要做什麼。你可以保持原樣並玩它。看看GUI類創建它時它自己的實例是如何給Listener的(新Listener(this)),如果文本字段包含文本,則標籤打印「無錯誤」,否則打印「錯誤」。 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對象提供參考?而且我對Java很新,所以我沒有很好的理解SwingUtilities的部分。 – 2012-03-29 20:28:54

+0

好的,所以我測試了你的代碼,它工作得很完美。現在我只需要弄清楚如何使用我自己的代碼加入它:D謝謝。 – 2012-03-29 21:37:44

+0

好的,祝你好運! – stolzem 2012-03-29 21:41:21

相關問題