2014-02-08 61 views
0

我有兩個名爲第一和第二個JFrame分別。兩個框架都有jtextfields來getText()和setText()。我能夠從第一個到第二個JFrame設置文本,但從第二個到第一個無法設置文本。無法從另一個JFrame JTextField setText()

在第一和第二幀我已經做了一切JTextFields將public static

first.java

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    second sec = new second(); 
    sec.jTextField1.setText(this.jTextField1.getText()); // this works 
    sec.jTextField2.setText(this.jTextField2.getText()); 
    sec.setVisible(true); 

    public static javax.swing.JTextField jTextField1; 
    public static javax.swing.JTextField jTextField2; 
    private javax.swing.JButton jButton1; 

second.java

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt) {           
    first f = new first(); 
    f.jTextField1.setText(this.jTextField3.getText()); //not working 
    f.jTextField2.setText(this.jTextField4.getText()); 
    } 
    public static javax.swing.JTextField jTextField1; 
    public static javax.swing.JTextField jTextField2; 
    public static javax.swing.JTextField jTextField3; 
    public static javax.swing.JTextField jTextField4; 
    private javax.swing.JButton jButton1; 

在第二幀按鈕第一幀的點擊應該得到更新。我不想再打開第一幀。

+0

但是,您的兩個類名均爲名稱! ? –

+0

你在使用netbeans嗎? – Ashish

+0

是的。和類名是'first'和'second' –

回答

0

如果你「不想再打開第一幀」,那麼你必須避免創建一個新的第一個實例,而是使用前一個實例的引用。

所以你需要一個參考...給你的第二個一到第一參考的一種方法是在構造函數中提供它,如:

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){           
    second sec = new second(this); //notice I'm passing a reference to this as an argument second's contstructor 
    sec.jTextField1.setText(this.jTextField1.getText()); // this works 
    sec.jTextField2.setText(this.jTextField2.getText()); 
    sec.setVisible(true); 

然後,你需要先存儲參考你的第二類,並使用它來訪問文本框:

private first f; 
public second(first referenceToFirst){ 
    this.f=referenceToFirst; 
} 

OK,然後使用f場,而不是實例點擊第二個按鈕,當一個新的第一...

private void jButton1ActionPerformed(java.awt.event.ActionEvent evt){           
    //first f = new first(); //don't instantiate a new first, use the one you got in the constructor 
    f.jTextField1.setText(this.jTextField3.getText()); 
    f.jTextField2.setText(this.jTextField4.getText()); 
} 

注:

我不會讓textfields爲public static,我寧願提供getter方法。

我建議你遵守命名約定:使用大寫字母作爲類,並使用重要名稱作爲變量。

+0

_「我不會讓textfields成爲公共靜態的,我寧願提供getter方法。」_ **'public static'不是方法!** –

1

在我開始之前,看看The Use of Multiple JFrames, Good/Bad Practice?`

「在第二幀按鈕,第一幀應該得到更新。我不想再開第一幀的點擊。」

它不工作,因爲你正在創建一個新的JFramefirst)。 當然它將打開一個新的框架。而不是創建一個新的框架,通過相同的引用。

我給你舉個例子,用JDialog代替JFrame。如果在閱讀上述鏈接並且您仍然決定JFrame是您想要的內容,則可以將相同的代碼應用到JFrame中。它們基本上具有相同的構造。

所以基本上我的意思是通過參考是這個。將JFrame傳遞給JDialog的構造函數。這樣你傳遞給它的JFrame將與JFrame相同。

public class MyDialog extends JDialog { 
    private First frame; 
    private JTextField thisTextField; 

    public MyDilaog(final First frame, boolean modal) { 
     super(frame, modal); 
     this.frame = frame; 

     thisTextFiled = new JTextField(20); 
    } 
} 

詮釋您的First類只是創建它像這樣

MyDialog dialog = new MyDialog(First.this, true); 

現在你已經在框架上的參考。您還需要JFrame類中的getter類,該類將從JFrame類訪問JTextField。然後你可以設置它的文本,因爲它也被引用。所以,你可以做這樣的事情從JDialog

public void actionPerformed(ActionEvent e) { 
    String text = thisTextField.getText(); 

    JTextField fieldFromFrame = frame.getTextField(); 
    fieldFromFrame.setText(text): 
} 

此外,您還需要使用Java命名約定。類名是大寫字母。所以First不是first

+0

什麼是'frame.getTextField();'這種類型的方法是這樣的。 –

+0

如果您閱讀完整的答案,您會注意到我說過要在JFrame類中創建該方法,該方法將返回要更改的文本字段。 –

0

嘗試在第一個jframe中將第二個jframe用作參數,而不是用它來更改文本字段