当前位置: 首页 > 面试题库 >

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

晋安国
2023-03-14
问题内容

我有一个GUI,添加了登录提示。

while(notValidLogIn){
        LoginPrompt.getDetails() //a static method that 
}

但是,loginPrompt是带有父JFrame的Jdialog。如何停止单击的取消循环,我可以将System.exit(0)置于执行的取消动作中。但是不想停止一切,我想要类似的东西:

while(notValidLogIn && LoginPrompt.isNotCancelled()){
  LoginPrompt.getDetails(); //a static method that creates an instance of login JDialog()
}

问题答案:

在我最近从事的项目中,我实现了一个基于事件的解决方案。这个想法是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();


 类似资料:
  • 问题内容: 关于按下inputDialoguebox的“取消”按钮,我有一个问题。我之前也曾问过类似的问题,因此我很抱歉重复自己的道歉。 我遇到的主要问题是,无论我按取消如何,代码都将执行,即使不添加任何输入,套接字连接也不会建立。 为什么会发生这种情况,我该如何避免呢? 因此,即使我确实按了取消,也可以通过目前的方式建立clientsocket连接。原因可能是因为我在同一台计算机上将服务器和客户

  • 编辑:底部的解决方案 这是一个跳棋游戏。单击一个按钮后,它等待单击第二个按钮与之交换。然而,有时你可能不想移动那个按钮,但一旦你点击了它,就没有回头路了,因为我无法禁用它。 在这里的其他帖子中,我看到人们使用 这只是使它在第一次单击后不可见。 这什么都干不了。 这也没什么用。编辑:所有这些方法都用true和false进行了尝试。 私有无效交换(){ 但你也需要 这样它就重新启用了它,或者其他什么,

  • 我在应用程序中使用uitabar。在我的一个选项卡栏中,UIViewController中有一个UITableView,其根视图控制器是导航控制器。当我点击一个单元格时,我会进入我的自定义编辑模式,这是一个UIViewController。 在我的编辑模式中,我有一个BackButton,它用TableView向我显示UIViewController。 我的问题是当我点击后退按钮,我的TabBar

  • 我的uwp应用程序收到来自php服务器的toast通知。它有两个操作按钮“View”和“Dissist”。当应用程序当前处于激活状态时,这些按钮可以正常工作。(单击“查看”按钮、“重定向到新页面”和“取消”按钮将不会执行任何操作。)。但当应用处于关闭状态时--当用户点击通知的Dissist按钮时,应用的启动图标就会出现。我怎么才能阻止这一切?我想在用户单击Dissist按钮时取消通知。

  • 我能找到的每个更改按钮图像的示例都显示了当单击该按钮时如何更改它。但是我如何点击一个切换按钮,并让它改变一个常规按钮的图像呢? 关于更多细节,我有两个按钮和一个onCheckedChanged事件: 当按下切换按钮并发生onCheckedChanged事件时,我需要将btn1的背景设置为新图像。

  • 我需要在商品搜索中键入“香蕉”,然后点击“GO”按钮。 在堆栈溢出的帮助下,我可以调出火狐,输入“香蕉”...但是“Go”按钮(基于检查的Go3)不会开火!! 我试过element.click(),试过ActionChains,试过将光标移动到元素,试过验证它已经启用。它只是不会转到下一个搜索页面。 我没有得到任何错误...它只是没有进入下一页。 谢谢你能提供的任何帮助。快把我逼疯了!