Ваши ожидания связаны с магическим мышлением.Поймите, что 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);
}