为了账号安全,请及时绑定邮箱和手机立即绑定

JFrame 动作侦听器在相同/链接的 JPanel 动作侦听器之前激活

JFrame 动作侦听器在相同/链接的 JPanel 动作侦听器之前激活

有只小跳蛙 2022-12-15 16:50:26
我是编程新手,正在尝试挥杆。我有一个用作默认菜单的 JFrame,还有一个出现在其中的 JPanel 来处理登录。成功登录后,JPanel 应该将登录信息发送到 JFrame,以便它知道当前登录的用户。问题是,在 JButton 被单击时,在 JPanel 有机会检查凭据之前激活发送部分(其代码是 JFrame)。他们都使用相同的 actionlistener,所以我不知道如何控制顺序。public class GUIFrame extends JFrame {    private DetailsPanel detailsPanel;    private String curUsername;    public GUIFrame(String title){        super(title);        detailsPanel = new DetailsPanel();        setLayout(new BorderLayout());        Container c = getContentPane();        c.add(detailsPanel, BorderLayout.EAST);        detailsPanel.addActionListener(new ActionListener() {            @Override            public void actionPerformed(ActionEvent e) {                if (!(detailsPanel.getCurUsername() == "")){                    randomToBeImplementedFunctionThatWillLogIn();                //TODO:                 // The check here happens BEFORE the detailsPanel processes everything                // so the first time they create an account it won't log them in                // and every subsequent time the PREVIOUS login creds will be used.             }        }    });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;    public DetailsPanel(){        nameField = new JTextField(0);        passField = new JTextField(0);             }  成功登录后,DetailsPanel 应该将信息发送到 GUIFrame,然后 GUIFrame 登录。相反,当发生 actionlistener 时,GUIFrame 会在 DetailsPanel 开始检查凭据并将其发送到 GUIFrame 之前尝试登录。有没有办法让 DetailsPanel.addActionListener() 在 logIn.addActionListener() 之后出现?
查看完整描述

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可以将用户凭据作为事件对象的一部分传回


查看完整回答
反对 回复 2022-12-15
  • 1 回答
  • 0 关注
  • 91 浏览

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信