ob1是一个JButton,单击时将弹出一个对话框。弹出后,弹出窗口将在底部显示“ Hello There”和“ Hi”按钮。当单击“ Hi”时,我希望它一起退出GUI。但是在这里看来我已经正确地完成了所有操作,但是我不明白为什么它不起作用。请帮忙。

谢谢

ob1.addActionListener(new ActionListener(){
        public void actionPerformed(ActionEvent ae){
            JDialog jd = new JDialog(); //Pop-Up window
            jd.setLocationRelativeTo(null);
            jd.setSize(350, 150);
            jd.setModal(true);
            JPanel jp = new JPanel();
            jp.setLayout(new BoxLayout(jp, BoxLayout.Y_AXIS));
            JLabel jl = new JLabel("Hello there");
            JButton jb3 = new JButton("Hi");
            jp.add(jl);
            jp.add(jb3);
            jd.add(jp);
            jd.setVisible(true);

            //acition listener for the Hi button and when clicked on supposed to exit the GUI
            jb3.addActionListener(new ActionListener(){
                public void actionPerformed(ActionEvent ae){
                    System.exit(0);
                }
            });
        }
    });

最佳答案

因为对话框是模态的...

jd.setModal(true);


该代码将在...处停止

jd.setVisible(true);


直到对话框关闭,这意味着...

//acition listener for the Hi button and when clicked on supposed to exit the GUI
jb3.addActionListener(new ActionListener(){
    public void actionPerformed(ActionEvent ae){
        System.exit(0);
    }
});


在对话框关闭后才调用,这意味着在对话框关闭后才将ActionListener注册到按钮,这是没有意义的...

切换这两行...

jb3.addActionListener(...);
jd.setVisible(true);


请查看How to Make Dialogs了解更多详细信息...

ps-实际上并不需要ActionListener,您可以在System.exit(0)调用之后简单地调用setVisible,但是您将使用JButton处理该对话框。

pps-您可以简单地使用JOptionPane在更少的代码行中获得相同的结果;)

更新...

从本质上讲,JOptionPane.showXxx是一种阻止方法,直到关闭显示的对话框,该方法才会返回。

这意味着您可以假定该方法返回了一个,对话框已关闭,并在用户按下“确定”时...

JOptionPane.showMessageDialog(jf, "Hello there", "Window", JOptionPane.INFORMATION_MESSAGE);
System.exit(0);

09-30 12:40
查看更多