Java Swing-单击取消按钮时不循环

Java Swing-单击取消按钮时不循环,第1张

Java Swing-单击取消按钮时不循环

在我最近从事的项目中,我实现了一个基于事件的解决方案。这个想法是JDialog通知其父级Jframe登录过程如何进行的,而最后一个登录名可能会也可能不会继续执行。这样,我就没有循环并保持各自的职责:模式将是这样的:

LoginEvent:这是事件本身。没那么复杂:

class LoginEvent extends EventObject {    public static final int LOGIN_SUCCEEDED = 0;    public static final int LOGIN_FAILED = 1;    public static final int LOGIN_DIALOG_CLOSED = 2;    private int id;    public LoginEvent(Object source, int id) {        super(source);        this.id = id;    }    public int getId() {        return id;    }}

LoginListener
处理这些LoginEvents的接口:

public interface LoginListener extends EventListener {    public void handleLoginEvent(LoginEvent evt);}

登录对话框
此类必须List订阅一个LoginListeners:

class LoginDialog {    List<LoginListener> listeners = new ArrayList<>();    JDialog dialog;    JButton accept;    JButton cancel;    public void show() {        //create and show GUI components    }    public void close() {        if(dialog != null) { dialog.dispose();        }    }    ...    public void addLoginListener(LoginListener loginEventListener) {        if(!listeners.contains(loginEventListener)) { listeners.add(loginEventListener);        }    }    public void removeLoginListener(LoginListener loginEventListener) {        listeners.remove(loginEventListener);    }    public void dispatchLoginEvent(LoginEvent evt) {        for(LoginListener loginListener: listeners) { loginListener.handleLoginEvent(evt);        }    }}

将动作侦听器添加到accept和cancel按钮:

    accept.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) { // validate login data if(loginValid) {     dispatchLoginEvent(new LoginEvent(dialog, LoginEvent.LOGIN_SUCCEEDED)); } else {     dispatchLoginEvent(new LoginEvent(dialog, LoginEvent.LOGIN_FAILED)); }        }    });    cancel.addActionListener(new ActionListener() {        @Override        public void actionPerformed(ActionEvent e) { dispatchLoginEvent(new LoginEvent(dialog, LoginEvent.LOGIN_DIALOG_CLOSED));        }    });

订阅LoginListener
在您的Jframe:

    final LoginDialog dialog = new LoginDialog();    dialog.addLoginListener(new LoginListener() {        @Override        public void handleLoginEvent(LoginEvent evt) { if(evt.getId() == LoginEvent.LOGIN_SUCCEEDED {     dialog.close();     //continue execution     return; } if(evt.getId() == LoginEvent.LOGIN_FAILED) {     JOptionPane.showMessageDialog(null, "Login failed!");     return; } if(evt.getId() == LoginEvent.CLOSE_LOGIN_DIALOG) {     dialog.close();     // do something when this dialog is closed }  }    };
dialog.show();


欢迎分享,转载请注明来源:内存溢出

原文地址: http://outofmemory.cn/zaji/5506175.html

(0)
打赏 微信扫一扫 微信扫一扫 支付宝扫一扫 支付宝扫一扫
上一篇 2022-12-13
下一篇 2022-12-12

发表评论

登录后才能评论

评论列表(0条)

保存