在JavaSwing中,如何在System.exit()之前显示inform JDialog?(闭门)
在我的简单登录窗口中,我将操作侦听器添加到我的登录按钮中。按下按钮后,程序将检查用户输入的信息,如果用户输入错误信息3次,程序将创建一个新的JDialog通知用户,然后程序将关闭 我的问题是JDialog显示为空,然后程序关闭 这是我的密码在JavaSwing中,如何在System.exit()之前显示inform JDialog?(闭门),java,swing,Java,Swing,在我的简单登录窗口中,我将操作侦听器添加到我的登录按钮中。按下按钮后,程序将检查用户输入的信息,如果用户输入错误信息3次,程序将创建一个新的JDialog通知用户,然后程序将关闭 我的问题是JDialog显示为空,然后程序关闭 这是我的密码 btnLogIn.addActionListener(new ActionListener() { @Override public void actionPerformed(ActionEvent actionEvent)
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的第一个问题,所以我还不习惯任何东西。我已经更改了我的代码使用计时器,使其在一段时间后退出。不管怎样,我很感激你的帮助。也许我应该结束这个问题。再次谢谢你。