java取消按钮_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 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();

2020-10-17

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值