为什么我的匿名类动作侦听器不能退出Java GUI?

时间:2014-10-07 03:50:38

标签: java swing actionlistener

ob1是一个JButton,当点击一个对话框时会弹出。一旦弹出,弹出窗口会显示" Hello There"和#34;嗨"下面的按钮。当"嗨"单击,我希望它一起退出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);
                }
            });
        }
    });

2 个答案:

答案 0 :(得分:3)

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

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是一种阻止方法,在它显示的对话框关闭之前,该方法不会返回。

这意味着您可以假设该方法返回一个,对话框已关闭,用户按下&#34; OK&#34; ...

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

答案 1 :(得分:0)

这是解决方案......

Exit() {
    setDefaultCloseOperation(EXIT_ON_CLOSE);
    setSize(500,500);

    ob1 = new JButton("Hi");
    ob1.addActionListener(new ActionListener() {
        public void actionPerformed(ActionEvent ae) {
            final 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");

            jb3.addActionListener(new ActionListener() {
                public void actionPerformed(ActionEvent ae) {
                    System.out.println("Hello...");
                    System.exit(0);
                }
            });

            jp.add(jl);
            jp.add(jb3);
            jd.add(jp);
            jd.setVisible(true); //It should be after the action listener....
        }
    });

    JPanel pane = new JPanel();
    pane.add(ob1);

    add(pane);
    setVisible(true);
}

public static void main(String args[]) {
    System.out.println("Hi...");
    new Exit();
}

您必须在调用setVisible()之前添加actionListener ....