我有一个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
而隐藏,因此按钮正常工作!
我做错了什么?
答案 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();
}
}