Порядок событий обычно не гарантируется. Наблюдательно, как правило, они запускаются в порядке FILO (сначала в, затем в выход).
Лучшим решением было бы разделить процесс, поэтому все заинтересованные стороны не полагаются на действие кнопки, а вместо этого на компонент, сообщающий им, когда произошла проверка.
«Простое» решение - использовать существующие функции API
public class DetailsPanel extends JPanel {
private HashMap<String, String> logInMap = new HashMap<String, String>();
private String curUsername = "";//the current logged in username
public String getCurUsername() {
return curUsername;
}
JTextField nameField;
JTextField passField;
JButton logIn;
public DetailsPanel() {
nameField = new JTextField(0);
passField = new JTextField(0);
logIn.addActionListener((e) -> {//login attempted
if (logInMap.containsKey(nameField.getText())) {
if (passField.getText().equals(logInMap.get(nameField.getText()))) {
//logged in
curUsername = nameField.getText();
fireActionPerformed();
} else {
//wrong password, logged out
curUsername = "";
}
} else {
logInMap.put(nameField.getText(), passField.getText());
curUsername = nameField.getText();
//create new account
}
});
GridBagConstraints gCons = new GridBagConstraints();
gCons.gridy = 0;
gCons.gridx = 0;
add(nameField, gCons);
gCons.gridy = 1;
add(passField, gCons);
}
public void addActionListener(ActionListener al) {
listenerList.add(ActionListener.class, al);
}
protected void fireActionPerformed() {
ActionListener[] listeners = listenerList.getListeners(ActionListener.class);
if (listeners.length == 0) {
return;
}
ActionEvent evt = new ActionEvent(this, ActionEvent.ACTION_PERFORMED, "validated");
for (ActionListener listener : listeners) {
listener.actionPerformed(evt);
}
}
}
Таким образом, в основном, или это делает, это сохраняет «зарегистрированные» ActionListener
s в доступных listenerList
. Это API, предоставляемый Swing, доступный для всех компонентов Swing.
При нажатии кнопки и подтверждении личности все зарегистрированные стороны уведомляются с помощью метода fireActionPerformed
.
Более полное решение, вероятно, будет включать ваш собственный прослушиватель событий interface
, который может включать validationSuccess
и validationUnsuccessful
и может передавать учетные данные пользователя как часть объекта события