0

据我了解,在一个摇摆应用程序中,我将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 已设置,应该是这样,但应用程序仍然关闭,这意味着,我认为,气垫船是正确的 - 这不是正确的目标。

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

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

4

1 回答 1

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...
于 2014-04-22T18:56:04.400 回答