如何在Java Swing中获取JTextField的值?

时间:2018-05-27 18:07:07

标签: java swing jbutton jtextfield

我有一个JTextField和一个JButton。我在点击按钮时尝试获取用户在文本字段中输入的内容。

class Screen extends React.Component {
  state = { context: null };
  canvas = React.createRef();
  componentDidMount() {
    this.setState({ context: this.canvas.current.getContext("2d") });
  }
  render() {
    return (
      <div>
        <canvas ref={this.canvas} />
        {this.state.context && (
          <CanvasContext.Provider value={this.state.context}>
            {this.props.children}
          </CanvasContext.Provider>
        )}
      </div>
    );
  }
}

我希望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而隐藏,因此按钮正常工作!

我做错了什么?

1 个答案:

答案 0 :(得分:1)

你的期望涉及神奇的思考。理解insideTextField包含一个String对象,一个实际上是 immutable 的对象(无法更改)。是的,当您创建insideTextField时,您为其分配了恰好位于JTextField中的字符串,可能是一个空的""字符串,但要理解当JTextField的文本属性发生更改时,{ {1}}不会,实际上不能自己神奇地改变。解决方案是具有insideTextField字段,而是为类提供一个getter方法,在需要时提取JTextField中的当前String。例如:

insideTextField

旁注:我通常使用模态JDialog和 JFrame来获取登录凭据。这样,由于对话框是模态的,我知道用户何时完成使用它。事实上,JOptionPane可以作为一个快速而肮脏的模态对话框创建者。例如,如果我们有一个像这样的登录JPanel:

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

再次使用getter方法提取JTextField中的文本,我们可以在JOptionPane中显示它,如下所示:

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();
    }
}