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

Java 如何使JoptionPane(没有面板)使用X关闭程序,java,swing,joptionpane,Java,Swing,Joptionpane,因此,我知道在这个网站上以及通过互联网通常会有很多类似的问题,但我一直无法找到确切的答案或满足我想要实现的目标的答案 我的程序中有多个JOptionPanes。所有这些作业窗格的上角都有一个“X”。目前,它们的功能与任何其他JOptionPane的默认按钮相同 如果用户单击“X”,我希望程序退出。使用任何其他按钮,屏幕将关闭,但使用“X”,我想引起系统。退出(0)类型的事件 我尝试通过使用if语句来实现这一点,如: int result = JOptionPane.showOptionDialo

因此,我知道在这个网站上以及通过互联网通常会有很多类似的问题,但我一直无法找到确切的答案或满足我想要实现的目标的答案

我的程序中有多个
JOptionPane
s。所有这些作业窗格的上角都有一个“X”。目前,它们的功能与任何其他
JOptionPane
的默认按钮相同

如果用户单击“X”,我希望程序退出。使用任何其他按钮,屏幕将关闭,但使用“X”,我想引起
系统。退出(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
s中有动作侦听器的按钮,程序仍会退出。我将发布此特定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”退出整个程序?我还有许多其他的
作业窗格
需要实施类似的措施

使用“X”,我想引起
系统。退出(0)
类型的事件

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

即使他们单击我的另一个
JButton
s中有动作侦听器的按钮,程序仍会退出

其次,用户通常不希望关闭对话框会存在程序,从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);
}
使用“X”,我想引起
系统。退出(0)
类型的事件

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

即使他们单击我的另一个
JButton
s中有动作侦听器的按钮,程序仍会退出

其次,用户通常不希望关闭对话框会存在程序,从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);
}

按[x]关闭窗口的步骤与按“取消”按钮相同。您必须生成自己的JDialog才能确定用户关闭窗口的实际机制。因此,如果不使用JOptionsPane以外的其他工具,就无法从逻辑上说“如果用户单击”X“关闭程序”?我还没有仔细阅读JavaDocs,但我似乎回忆起[Cancel]和[X]从
JOptionPane
API的角度来看也是一样的,如果您想了解更多信息,您需要创建自己的
JDialog
,并向其中添加
JOptionPane
,谢谢您的评论。我会将其标记为完成,但您没有将其设置为答案。@它们是不同的返回值:
是选项
否选项
取消选项
确定选项
关闭选项
。按[x]关闭窗口与按取消按钮相同。您必须生成自己的JDialog才能确定用户关闭窗口的实际机制。因此,如果不使用JOptionsPane以外的其他工具,就无法从逻辑上说“如果用户单击”X“关闭程序”?我还没有仔细阅读JavaDocs,但我似乎回忆起[Cancel]和[X]从
JOptionPane
API的角度来看也是一样的,如果您想了解更多信息,您需要创建自己的
JDialog
,并向其中添加
JOptionPane
,谢谢您的评论。我会将其标记为完成,但您没有将其设置为答案。@mad它们是不同的返回值:
是选项
否选项
取消选项
确定选项
关闭选项