Как получить значение JTextField в Java Swing? - PullRequest
0 голосов
/ 27 мая 2018

У меня есть JTextField и JButton.Я пытаюсь определить, какие пользовательские типы в текстовом поле нажимают на кнопку.

public String insideTextField;

public void login() {

    loginFrame = new JFrame("Test");
    loginFrame.setIconImage(imageIcon.getImage());
    loginFrame.setSize(400,400);
    loginFrame.setLayout(new GridLayout(12, 3));

    loginFrame.add(usernameField);
    loginFrame.add(loginButton);

    loginButton.addActionListener(e -> {

        insideTextField = usernameField.getText();
        loginFrame.setVisible(false);
    });

    loginFrame.setVisible(true);
}

, и я ожидаю, что insideTextField будет тем, что пользователь вводит в текстовое поле после того, как я вызвал этот метод.но это ноль.Однако loginFrame будет скрыт из-за loginFrame.setVisible(false);, поэтому кнопка работает!

что я делаю не так?

1 Ответ

0 голосов
/ 27 мая 2018

Ваши ожидания связаны с магическим мышлением.Поймите, что insideTextField содержит объект String, объект, который на самом деле является неизменным (не может быть изменен).Да, когда вы создаете insideTextField, вы присваиваете ему строку, которая точно так же находится в JTextField, вероятно, пустую строку "", но понимаете, что когда свойства текста JTextField изменятся, insideTextField не будети на самом деле не может волшебным образом измениться самостоятельно.Решение состоит в том, чтобы , а не , имели поле insideTextField и вместо этого давали классу метод getter, который извлекает текущую строку внутри JTextField, когда это необходимо.Например:

public String getUserName() {
    return usernameField.getText();
}

Примечание: я обычно использую модальный JDialog и не JFrame для получения учетных данных для входа.Таким образом, поскольку диалоговое окно является модальным, я знаю, когда пользователь завершит его использование.И на самом деле JOptionPane работает как быстрый и грязный модальный создатель диалогов.Например, если у нас был логин JPanel, подобный так:

import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;

import javax.swing.BorderFactory;
import javax.swing.JLabel;
import javax.swing.JPanel;
import javax.swing.JPasswordField;
import javax.swing.JTextField;

@SuppressWarnings("serial")
public class LoginPanel extends JPanel {
    private static final int GAP = 3;
    private JTextField usernameField = new JTextField(10);
    private JPasswordField passwordField = new JPasswordField(10);

    public LoginPanel() {
        setLayout(new GridBagLayout());
        GridBagConstraints gbc = getGbc(0, 0);
        add(new JLabel("User Name:"), gbc);
        gbc = getGbc(1, 0);
        add(usernameField, gbc);
        gbc = getGbc(0, 1);
        add(new JLabel("Password:"), gbc);
        gbc = getGbc(1, 1);
        add(passwordField, gbc);
        setBorder(BorderFactory.createEmptyBorder(GAP, GAP, GAP, GAP));
    }

    private static GridBagConstraints getGbc(int x, int y) {
        GridBagConstraints gbc = new GridBagConstraints();
        gbc.gridx = x;
        gbc.gridy = y;
        gbc.fill = GridBagConstraints.HORIZONTAL;
        gbc.weightx = 1.0;
        gbc.weighty = 1.0;
        gbc.insets = new Insets(GAP, GAP, GAP, GAP);
        gbc.anchor = x == 0 ? GridBagConstraints.WEST : GridBagConstraints.EAST;        

        return gbc;
    }

    public String getUserName() {
        return usernameField.getText();
    }

    public char[] getPassword() {
        return passwordField.getPassword();
    }
}

снова тот, который использует методы получателя для извлечения текста в JTextField, мы могли бы отобразить его в JOptionPane следующим образом:

JFrame frame = new JFrame("LoginExample");
frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);

// fill the JFrame with the main GUI
// .... 

frame.pack();

// create the LoginPanel JPanel here
LoginPanel loginPanel = new LoginPanel();

// and display it in a JOptionPane here
int result = JOptionPane.showConfirmDialog(frame, loginPanel, 
        "User Log-In", JOptionPane.OK_CANCEL_OPTION, JOptionPane.PLAIN_MESSAGE);
if (result == JOptionPane.OK_OPTION) {
    String userName = loginPanel.getUserName();
    char[] password = loginPanel.getPassword();

    // test to make sure code is working
    System.out.println("User Name: " + userName);

    // check for name/password validity here
    // ... if name/password OK, then show JFrame:
    frame.setLocationRelativeTo(null);
    frame.setVisible(true);
}
...