如何调试DO_NOTHING_ON_CLOSE失败?

时间:2014-04-22 18:47:55

标签: java swing saf

根据我的理解,在一个摇摆应用程序中,我告诉mainFrame我的申请DO_NOTHING_ON_CLOSE

public SurveyView(SingleFrameApplication app) throws FileNotFoundException, IOException {
        super(app);

        initComponents();

        JFrame mainFrame = SurveyApp.getApplication().getMainFrame();
        mainFrame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

        //And on and on it goes...
}

显然我会添加一个窗口监听器以及以后不打扮的东西,但是现在,我只需要在单击X时不关闭窗口。但窗户关闭了。

操作似乎很简单,我甚至无法想到如何调试它。我错过了一些显而易见的东西吗?

编辑:以下是SurveyApp课程中的getApplication方法:

public static SurveyApp getApplication() {
        return Application.getInstance(SurveyApp.class);
    }

Edit2:由于HoverCraft建议mainFrame不是罪魁祸首,因此对应用结构的概述可能会指出我们正确的方向。整个应用程序包含在一个JPanel mainPanel中。反过来,该面板包含在public class SurveyView extends FrameView内。我的所有参与者都被添加到面板中,这是一种卡片布局,可以循环浏览其他几种JPanel。据我了解,关闭操作是为帧而不是视图或面板保留的。因此,为什么我的第一个想法是针对应用程序的主框架。

我知道主框架存在。我尝试了System.out.println(SurveyApp.getApplication().getMainFrame())并输出了这个怪物(为了可读性而换行):

javax.swing.JFrame[mainFrame,0,0,0x0,invalid,hidden,
layout=java.awt.BorderLayout,title=Accounting Survey,
resizable,normal,defaultCloseOperation=DO_NOTHING_ON_CLOSE,
rootPane=javax.swing.JRootPane[,0,0,0x0,invalid,
layout=javax.swing.JRootPane$RootLayout,alignmentX=0.0,
alignmentY=0.0,border=,flags=16777673,maximumSize=,minimumSize=,preferredSize=],
rootPaneCheckingEnabled=true]

我注意到标题实际上是我应用标题栏中显示的标题。但后来我看到DO_NOTHING_ON_CLOSE已经设置好了,但应用仍然关闭,这意味着,我认为,气垫船是对的 - 这不是正确的目标。

编辑3:进一步的研究表明,netbeans确实构建了每个面板并将其添加到mainPanel,一旦添加了所有面板,它就会调用setComponent(mainPanel);,我和# 39; m假设在其他地方建立,但整个程序的Ctrl-F没有任何结果。有更多netbeans经验的人是否知道它所使用的所有这些方法的定义?如果我能找到,我可能能够找出哪个帧需要无关闭集。

编辑4:好吧,我想我已经关闭了。 mainPanel被设置为FrameView的组件,它似乎是java SingleFrameApplication创建的包装器。我在这里做了一些阅读:http://bellquel.bo.cnr.it/appframework/org/jdesktop/application/SingleFrameApplication.html看起来我确实是正确的:由SFA创建的框架命名为mainFrame,根据文档," getMainFrame()返回用于的JFrame显示此应用程序。"意思是我正在定位正确的JFrame,并且基于我之前的测试,默认关闭操作IS实际上被设置为什么都不做。什么给出了什么?我正在瞄准正确的框架,正确设置操作,然后它被忽略了?什么可以覆盖默认的关闭操作?

1 个答案:

答案 0 :(得分:3)

  

我只需要在单击X时不关闭窗口。但窗户关闭了。

试试这个简单的代码

EventQueue.invokeLater(new Runnable() {

        @Override
        public void run() {
            JFrame frame = new JFrame();                
            frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE);

            frame.addWindowListener(new WindowAdapter() {

                @Override
                public void windowClosing(WindowEvent we) {
                    System.out.println("closing...");
                }

                @Override
                public void windowClosed(WindowEvent we) {
                    System.out.println("closed..");
                }
            });

            frame.setVisible(true);
        }
 }

输出(单击X时)

closing...