Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/374.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JavaSwing中,如何在System.exit()之前显示inform JDialog?(闭门)_Java_Swing - Fatal编程技术网

在JavaSwing中,如何在System.exit()之前显示inform JDialog?(闭门)

在JavaSwing中,如何在System.exit()之前显示inform JDialog?(闭门),java,swing,Java,Swing,在我的简单登录窗口中,我将操作侦听器添加到我的登录按钮中。按下按钮后,程序将检查用户输入的信息,如果用户输入错误信息3次,程序将创建一个新的JDialog通知用户,然后程序将关闭 我的问题是JDialog显示为空,然后程序关闭 这是我的密码 btnLogIn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent)

在我的简单登录窗口中,我将操作侦听器添加到我的登录按钮中。按下按钮后,程序将检查用户输入的信息,如果用户输入错误信息3次,程序将创建一个新的JDialog通知用户,然后程序将关闭

我的问题是JDialog显示为空,然后程序关闭

这是我的密码

btnLogIn.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            char[] pass = pssPassWord.getPassword();
            String pss = new String(pass);

            if (!pss.toString().equals("admin") || !txtUserName.getText().equals("Adminuser")){
                if (attempts == 2){
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            new Inform("You entered the wrong info 3 times, the program will shut down");
                            try {
                                Thread.sleep(1000);
                                System.exit(0);
                            } catch (InterruptedException e) {
                                e.printStackTrace();
                            }
                        }
                    });



                }else {
                    SwingUtilities.invokeLater(new Runnable() {
                        @Override
                        public void run() {
                            new Info("Wrong info, please check the info");
                        }
                    });
                    attempts += 1;
                }
            }else{

            }
        }
    });
这是我的课堂:

public class Inform extends JDialog{

private JPanel pnlInform;
private JLabel lblInform;
private JButton btnOK;

public Inform(String info){
    setContentPane(pnlInform);
    lblInform.setText(info);
    pack();
    setVisible(true);
    setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
    setLocationRelativeTo(null);
    btnOK.addActionListener(new ActionListener() {
        @Override
        public void actionPerformed(ActionEvent actionEvent) {
            dispose();
        }
    });
}
}


我的IDE是Intellij IDEA,我使用form类来创建GUI,因此没有对元素进行声明。

您没有向
通知
对话框添加任何组件,因为
pnlInform
未构造并解析为
null
,它将通过
内容窗格设置为null。

解决方案:构造组件(pnlInform、lblInform、btnOK),然后将它们添加到对话框中。您可以在下面找到完整的功能代码:

package test.q5;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Inform extends JDialog {

    private JPanel pnlInform=new JPanel();
    private JLabel lblInform=new JLabel();
    private JButton btnOK=new JButton("OK");

    public Inform(String info) {
//      setContentPane(pnlInform);
        add(pnlInform);
        lblInform.setText(info);
        pnlInform.add(lblInform);
        pnlInform.add(btnOK);

        pack();
        setVisible(true);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
        btnOK.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                dispose();
            }
        });
    }

    public static void main(String[] args) {
        new Inform("Hello");
    }
}

但是,您仍然需要对消息进行一些格式化,请随意将其添加为另一个问题以提供帮助。

您没有向
通知
对话框添加任何组件,因为
pnlInform
未构造且解析为
null
,它将通过
内容窗格设置为null。

解决方案:构造组件(pnlInform、lblInform、btnOK),然后将它们添加到对话框中。您可以在下面找到完整的功能代码:

package test.q5;

import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JDialog;
import javax.swing.JLabel;
import javax.swing.JPanel;

public class Inform extends JDialog {

    private JPanel pnlInform=new JPanel();
    private JLabel lblInform=new JLabel();
    private JButton btnOK=new JButton("OK");

    public Inform(String info) {
//      setContentPane(pnlInform);
        add(pnlInform);
        lblInform.setText(info);
        pnlInform.add(lblInform);
        pnlInform.add(btnOK);

        pack();
        setVisible(true);
        setDefaultCloseOperation(JDialog.DISPOSE_ON_CLOSE);
        setLocationRelativeTo(null);
        btnOK.addActionListener(new ActionListener() {
            @Override
            public void actionPerformed(ActionEvent actionEvent) {
                dispose();
            }
        });
    }

    public static void main(String[] args) {
        new Inform("Hello");
    }
}

但是,您仍然需要对邮件进行一些格式化,请随意将其添加为另一个问题以提供帮助。

邮件是否立即关闭?然后,您可能需要给
信息
一些时间来显示。为什么
actionPerformed()中的
invokeLater()
?你不是已经在EDT上运行了吗?@KevinWallis它将在1秒后关闭,因为我使用了Thread.sleep(1000)。在此之前,信息JDialog出现,但为空。@CatalinaIsland我最近刚开始编程Java,我认为它会更安全,我将在下一个程序中注意到。谢谢。另外,不要在EDT上睡觉;对话框关闭时退出。启动一个swing
计时器
,在用户没有响应的情况下调用
exit()
。它是否立即关闭?然后,您可能需要给
信息
一些时间来显示。为什么
actionPerformed()中的
invokeLater()
?你不是已经在EDT上运行了吗?@KevinWallis它将在1秒后关闭,因为我使用了Thread.sleep(1000)。在此之前,信息JDialog出现,但为空。@CatalinaIsland我最近刚开始编程Java,我认为它会更安全,我将在下一个程序中注意到。谢谢。另外,不要在EDT上睡觉;对话框关闭时退出。启动swing
计时器
,调用
exit()
,以防用户没有响应。我很高兴你能帮我这么多。这是我关于StackOverFlow的第一个问题,所以我还不习惯任何东西。我已经更改了我的代码使用计时器,使其在一段时间后退出。不管怎样,我很感激你的帮助。也许我应该结束这个问题。再次感谢。我很高兴你能帮我这么多。这是我关于StackOverFlow的第一个问题,所以我还不习惯任何东西。我已经更改了我的代码使用计时器,使其在一段时间后退出。不管怎样,我很感激你的帮助。也许我应该结束这个问题。再次谢谢你。