如何使JOptionsPane(没有面板)用X关闭程序

时间:2016-01-13 19:31:13

标签: java swing joptionpane

所以我知道在这个网站和整个互联网上提出了很多类似的问题,但是我找不到确切的答案或者能够满足我想要完成的事情。

我的程序中有多个JOptionPane个。所有这些JOptionsPane都有一个" X"在顶角。目前,它们的功能与任何其他JOptionPane的默认按钮功能相同。

如果用户点击" X",我希望程序退出。与其他任何按钮一起,屏幕将关闭,但是" X"我想引发System.exit(0)类型的事件。

我尝试使用if语句来实现这一点:

int result = JOptionPane.showOptionDialog(null, getPanel(),"Return Builder", JOptionPane.OK_CANCEL_OPTION, 
                JOptionPane.PLAIN_MESSAGE, null, options, "default");

        if(result==JOptionPane.CLOSED_OPTION){
            System.exit(0);
        }

但我发现无论用户点击哪个按钮,整个程序都会退出。即使他们点击了其他一个有动作监听器的JButton,程序仍会退出。我将发布这个特定GUI的更完整图片:

public static void displayGUI(){//Method to display the GUI. 

        final JButton buttonCreate = new JButton("Create Return");
        final JButton buttonConfirm = new JButton("Confirm");

        buttonConfirm.addActionListener(new ActionListener(){

            public void actionPerformed(final ActionEvent ae){


                if(output.getSize()>0){
                    JOptionPane.getRootFrame().dispose();   
                }else if(verifyBatch==true){
                    JOptionPane.getRootFrame().dispose();
                }else if(verifyBatch==false && output.getSize()==0){
                    JOptionPane.showMessageDialog(null, "You haven't added any transactions to confirm" +
                            " and you have no previously completed batches!");
                }
            }           
        });

        buttonCreate.addActionListener(new ActionListener(){

            public void actionPerformed(final ActionEvent ae){

                if(verifyBatch==true){

                    initialScreenDecisions="NONE";//The user did not choose to add any entry details to the output list.
                    MainWriter.finishedCounter=true;//The boolean counter to trigger that the return is finished goes to true.
                    while(MainWriter.entryDetails.size()>0){//Removes all entry details from the input list.
                        MainWriter.entryDetails.remove(0);
                    }

                    while(output.size()>0){//Removes all entry details from the output list..
                        output.remove(0);
                    }

                    JOptionPane.getRootFrame().dispose();

                }else{

                    JOptionPane.showMessageDialog(null, "There are no completed batches!");     

                }
            }
        });

        //Creates a JOptionPane for the first GUI featuring 7 buttons and 2 lists..

        final Object[] options = new Object[] {buttonConfirm,buttonCreate};

        int result = JOptionPane.showOptionDialog(null, getPanel(),"Return Builder", JOptionPane.OK_CANCEL_OPTION, 
                JOptionPane.PLAIN_MESSAGE, null, options, "default");

        if(result==JOptionPane.CLOSED_OPTION){
            System.exit(0);
        }
    }

所以从这个例子中,我怎样才能制作" X"而且只有" X"退出整个程序?我有许多其他JOptionsPane我需要实施类似的措施。

1 个答案:

答案 0 :(得分:2)

  

使用“X”我想引发System.exit(0)类型的事件。

首先,JVM将在您的最后一个窗口(JOptionPane)关闭后自动退出。这可能是

的原因
  

即使他们点击了其他一个有动作监听器的JButton,程序仍会退出。

其次,用户通常不希望关闭对话框存在程序,从GUI设计的角度考虑它。您通常有一个父JFrame,对话框补充它,它们不是GUI的“驱动力”。

如果我创建一个框架只是为了停止自动关闭JVM,你会发现JOptionPane确实给出了不同的返回值来按下“X”和其他选项:

public static void main(String[] args) {

    JFrame frame = new JFrame();
    frame.setVisible(true);
    int result = JOptionPane.showConfirmDialog(null, "AA");
    System.out.println(result);
    if (result == JOptionPane.CLOSED_OPTION)
        System.exit(0);
}