2014-10-09 4 views
1

Так что я пытаюсь создать экран входа в систему, который запрашивает у пользователя текстовое поле и 2 кнопки (Вход и Отмена). Когда пользователь обращается к логину, я хочу, чтобы значение JTextField хранилось в переменной или, по крайней мере, могло быть использовано. Когда я пытаюсь сделать что-либо с помощью метода playerNameTxt.getText(), я получаю сообщение об ошибке, как будто playerNameTxt не существует.JTextField сохраняет вход пользователя как String

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

Вы сначала объявляете поле вне конструктора, затем вы снова объявляете его внутри конструктора, чтобы он был удален после того, как конструктор вернется и графический интерфейс был уничтожен, и он не будет использоваться для вашего класса после конструктор закончен. Вы должны изменить эту строку:

JTextField playerNameTxt = new JTextField(20); 

к этому:

playerNameTxt = new JTextField(20); 
+0

Мне нужно изменить JLabel и JButtons быть объявлены так же делать? –

+0

@ThomasSteinholz Я бы всегда объявлял их глобальными, а не локальными переменными, но в вашем случае нет необходимости в этом (поэтому в вашем случае это не имеет значения) – msrd0

0

В конструкторе, вы не ссылки на переменную экземпляра playerNameTxt - вы делаете новую локальную переменную. Вы должны изменить JTextField playerNameTxt = new JTextField(20); на playerNameTxt = new JTextField(20); (или this.playerNameTxt = new JTextField(20);), чтобы правильно инициализировать переменную. Затем вы должны иметь возможность вызывать методы на нем без предупреждений или ошибок, считая, что все остальное верно.

Смежные вопросы