2013-07-30 79 views
1

我有Jframe有JTextField和JButton。它應該將Jtextfield的文本返回到另一個類(MainPage)。 但是當程序啓動時,它將返回null給類。從Jframe返回由jbutton

public class JframeFoo extends JFrame { 

    private String username = new String(); 

    public JframeFoo() { 
     // -------------------------------------------------------------- 
     // Making Frame for login 

     final JTextField usernameFiled = new JTextField(); 
     this.add(usernameFiled); 

     JButton signinButton = new JButton(); 
     // ------------------------------------------------------------ 

     signinButton.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent arg0) { 

       setVisible(false); 
       Main.mainpage.setVisible(true); 

      } 
     }); 
     // ---------------------------------------------------------------------- 
     username = usernameFiled.getText(); 
    } 

    public String getuserName() { 
     return this.username; 
    } 
} 

(此JFrame的應在程序開始運行,當它得到的文本,就應該到無形的和其他類應該變得可見。)

+0

查看此linke:[**在一個JFrame的文本字段中輸入的值作爲其他JFrame **中的輸入參數](http://stackoverflow.com/questions/17412498/pass-values-entered-in-one -jframes-text-field-as-an-input-parameter-in-other-jf/17413372#17413372) – Azad

回答

3

您需要將調用用戶名= usernameField .getText()放入actionPerformed方法中。它只會被設置爲空你目前擁有它的方式。

+0

沒有區別。幀仍然返回空 –

3

創建該框架時調用構造函數JFrameFoo()。因此,此行:

username = usernameFiled.getText(); 

也被稱爲那一刻。你想要做的,而不是什麼是:

signinButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent arg0) {    
     username = usernameFiled.getText(); 
     setVisible(false); 
     Main.mainpage.setVisible(true); 
    } 
}); 

編輯

我想到的,也要去錯的是你在你的主類使用userName它初始化之前。我會推薦兩件事:

  1. 瞭解事件驅動的編程和回調。一個簡單的事實是,來源中的一行在另一行之下並不意味着它稍後被執行。
  2. 與其說mainPage.setVisible的,這樣做

signinButton.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent arg0) {    
     setVisible(false); 
     Main.mainpage.open(usernameFiled.getText()); 
    } 
}); 

,並添加方法在你的炫魅,做這樣的事情

public void open(String username) { 
    this.setVisible(true); 
    // do whatever you want to do with username 
} 
+0

沒有區別。我還得到了nullpointerException –

+0

@Shaftak,那麼在你沒有提供的部分代碼中出現其他問題。你能展示:1)你如何創建'JFrameFoo'和2)你如何調用'getUserName()' –

+0

我在我的主類中有一個JFoo的實例。 和MainPage'系統。out.println(Main.JFrameFoo.getuserName());' –

2

除了調用getText()方法從actionPerformed重寫的方法中,你也可以使用this.dispose();,而不是setVisible(false);

使你的代碼看起來是這樣的:

 signinButton.addActionListener(new ActionListener() { 
      @Override 
      public void actionPerformed(ActionEvent arg0) { 
       username = usernameFiled.getText(); 
       if ((username != null) || !(username.length() == 0)) { 
        this.dispose(); 
        Main.mainpage.setVisible(true); 
       } else { 
        // Appropriate error here... 
       } 
      } 
     }); 

調用從actionPerformedgetText()也將允許你這樣做對用戶名變量進行一些檢查你處置框架的前並繼續(再次,見上面的片段)。

祝你好運!

+0

我現在有點困惑,如何處理後,會調用方法'getuserName()'?這不會完全擦除與參考相關的內存中的所有內容嗎?儘管你提出的想法毫無疑問是很好的,但是這個類沒有任何目的地擴展了JFrame。儘管如果我們僅僅使用引用而不是擴展,那麼在我看來它可以起作用。 –

+0

雖然答案爲+1,但這會在一段時間內出現。我的限制今天沒有了:-) –