1 回答
TA贡献1779条经验 获得超6个赞
通常不能保证事件的顺序。从观察上看,它们倾向于按 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在 available 中listenerList。这是 Swing 提供的可用于所有 Swing 组件的 API。
单击按钮并验证身份后,将通过该fireActionPerformed方法通知所有注册方。
一个更完整的解决方案可能会涉及您自己的事件侦听interface器,它可以包括validationSuccess并且validationUnsuccessful可以将用户凭据作为事件对象的一部分传回
添加回答
举报