2012-04-08 59 views
4

我目前正在進行第一年的大學項目,我有一個問題,雖然我懷疑這是一個非常複雜的問題,但我一直在尋找,而我無法找到一個合適的答案。Passing.getText()字符串到另一個類

問題涉及兩類。一個gui類(class1)和另一個類(class2),當我運行代碼時,第二個類在嘗試從class1中檢索class2中的getText()字符串時給了我一個nullpointerexception。

我在class1中有一個JTextField,並試圖通過.getText()值傳遞給class2並將其存儲在String類型變量中。

當前的代碼我試圖與實現這一目標是下列(簡化):

public class Class1 { 

    private JTextField textField = new JTextField("Something"); 

     public Class1() {} 
    ... 
    public String getTextFieldString() { 
     return textField.getText(); 
    } 
} 

public class Class2 { 

    public Class2(Class1 class1) { 
    c1=class1 
    } 
    private c1 Class1 = new Class1(); 
    private String s = new String(); 
    ... 
    s = c1.getTextFieldString(); 
} 

我很新的編碼,我讀過,也許我需要通過參數我認爲這是因爲textField本身不是靜態的,當有人輸入一個新值時它會改變。 (對不起,在那裏顯而易見)

無論如何,幫助表示讚賞。非常感謝!

+0

您可能需要先了解一些基礎知識,包括Java如何實現面向對象的原則以及Java參考變量如何工作。這將非常有助於您的GUI編程。 – 2012-04-08 23:34:25

+0

你究竟在哪裏調用'新的Class2(c1)',就像在我的答案中一樣? – 2012-04-08 23:43:10

+0

啊,我只看到你的代碼的最上面一塊,我指的是。你一定早就提交了,或者我只是一個很有可能的白癡。 – DanMc 2012-04-08 23:46:49

回答

4

我可以幫助審查在Java中prescribedinitialization order。特別是,在有效的Class1實例存在時,應該完成textField實例變量初始值設定項。違反此命令的一種方法是在不同的線程上構建Class1Class2。爲了排除這個,Swing GUI對象應該在event dispatch thread上構建和操縱只有,如下面的sscce所示。

import java.awt.EventQueue; 
import javax.swing.JFrame; 
import javax.swing.JLabel; 
import javax.swing.JPanel; 
import javax.swing.JTextField; 

/** @see http://stackoverflow.com/q/10067399/230513 */ 
public class NewJavaGUI extends JPanel { 

    public NewJavaGUI() { 
     Class1 class1 = new Class1(); 
     Class2 class2 = new Class2(class1); 
     this.add(class1.textField); 
     this.add(new JLabel(class2.s)); 
    } 

    private static class Class1 extends Object { 

     private final JTextField textField = new JTextField("Something"); 

     public Class1() {} // implicit 

     public String getTextFieldString() { 
      return textField.getText(); 
     } 
    } 

    private static class Class2 extends Object { 

     private final Class1 c1; 
     private final String s; 

     public Class2(Class1 class1) { 
      c1 = class1; 
      s = c1.getTextFieldString(); 
     } 
    } 

    private void display() { 
     JFrame f = new JFrame("NewJavaGUI"); 
     f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
     f.add(this); 
     f.pack(); 
     f.setLocationRelativeTo(null); 
     f.setVisible(true); 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 

      @Override 
      public void run() { 
       new NewJavaGUI().display(); 
      } 
     }); 
    } 
} 
2

聽起來好像你有興趣知道某人何時修改了文本字段中的文本。我的第一條建議是在有關Swing組件的特定問題時查看java教程。具體來說,查看JTextField tutorial中的addActionListener方法,其中包括Text Demo示例。

2

嗯,你可以在Class2構造函數傳遞給Class1的引用,並把它保存在一個屬性,每一次Class2所需要的文本,只需調用屬性的getText()方法。

public class Class2 { 
    private Class1 class1; 
    public Class2(Class1 reference) { 
     class1 = reference; 
    } 
    public void someMethod() { 
     String s = class1.getTextFieldString(); 
    } 
} 

現在,當你實例化一個Class2對象:

Class1 c1 = new Class1(); 
Class2 c2 = new Class2(c1); 
+0

啊,我真的很抱歉,我已經在第2課中提及class1了,我想我已經在做你正在建議的內容,但它仍然無法正常工作。我應該已經更清楚了,我將編輯我的代碼並將其加入。 – DanMc 2012-04-08 23:36:32

+0

如果您得到'NullPointerException',這意味着您忘記實例化一些對象('... = new ...') ,在你的代碼中的某處 – 2012-04-08 23:39:33

相關問題