2014-10-09 41 views
1

所以我試圖創建一個登錄屏幕,提示用戶一個文本框和2個按鈕(登錄和取消)。當用戶登錄時,我想將JTextField的值存儲在一個變量中,或者至少可以使用。當我嘗試使用playerNameTxt.getText()方法進行任何操作時,出現錯誤,好像playerNameTxt不存在。JTextField保存用戶輸入爲一個字符串

public class GUI extends JPanel implements ActionListener { 

protected JTextField playerNameTxt; 

public GUI() { 
    JTextField playerNameTxt = new JTextField(20); 

    JLabel playerNameLbl = new JLabel("Enter Player Name"); 

    JButton loginBtn = new JButton("Login"); 
    loginBtn.setVerticalTextPosition(AbstractButton.BOTTOM); 
    loginBtn.setHorizontalTextPosition(AbstractButton.LEFT); 
    loginBtn.setMnemonic(KeyEvent.VK_D); 
    loginBtn.setActionCommand("login"); 
    loginBtn.addActionListener(this); 
    loginBtn.setToolTipText("Click this to Login"); 

    JButton cancelBtn = new JButton("Cancel"); 
    cancelBtn.setVerticalTextPosition(AbstractButton.BOTTOM); 
    cancelBtn.setHorizontalTextPosition(AbstractButton.RIGHT); 
    cancelBtn.setMnemonic(KeyEvent.VK_M); 
    cancelBtn.setActionCommand("cancel"); 
    cancelBtn.addActionListener(this); 
    cancelBtn.setToolTipText("Click this to Cancel"); 

    add(playerNameLbl); 
    add(playerNameTxt); 
    add(loginBtn); 
    add(cancelBtn); 
} 

public void actionPerformed(ActionEvent e) { 
    if ("login".equals(e.getActionCommand())) { 
     System.out.println(playerNameTxt); 
    } else { 
     System.exit(0); 
    } 
} 

private static void createAndShowGUI() { 
    JFrame frame = new JFrame("-- Munitions Login --"); 
    frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 
    frame.setLocation(400, 200); 

    GUI newContentPane = new GUI(); 
    newContentPane.setOpaque(true); 
    frame.setContentPane(newContentPane); 

    frame.pack(); 
    frame.setVisible(true); 
} 

public static void main(String[] args) { 
    javax.swing.SwingUtilities.invokeLater(new Runnable() { 
     public void run() { 
      createAndShowGUI(); 
     } 
    }); 
} 
} 

回答

5

您首先在構造函數外部聲明該字段,然後再次在構造函數中聲明它,以便在構造函數返回並且GUI被銷燬後它將被刪除,並且它將不會用於構造函數已完成。你應該改變這一行:

JTextField playerNameTxt = new JTextField(20); 

這樣:

playerNameTxt = new JTextField(20); 
+0

我需要改變我的JLabel和Jbutton將被宣佈以同樣的方式? – 2014-10-09 16:21:05

+0

@ThomasSteinholz我總是將它們聲明爲全局變量,而不是局部變量,但在你的情況下,不需要它(因此在你的情況下它並不重要) – msrd0 2014-10-09 16:21:57

0

在你的構造函數,你是不是引用實例變量playerNameTxt - 你正在做一個新的局部變量。您應該將JTextField playerNameTxt = new JTextField(20);更改爲playerNameTxt = new JTextField(20);(或this.playerNameTxt = new JTextField(20);)以正確初始化該變量。然後,您應該能夠在沒有任何警告或錯誤的情況下調用其中的方法,假設其他所有內容都是正確的。

相關問題