java - 如何调试 DO_NOTHING_ON_CLOSE 失败?

标签 java swing saf

据我了解,在 swing 应用程序中,我已将应用程序的 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);
    }

编辑2:由于 HoverCraft 表明 mainFrame 不是罪魁祸首,也许应用程序结构的概述将为我们指明正确的方向。整个应用程序包含在一个 JPanel mainPanel 中。该面板又包含在 public class SurveyView extends FrameView 内。我的所有组件都添加到面板中,这是一个卡片布局,在几个不同的其他 JPanel 之间循环。据我了解,关闭操作是为框架保留的,而不是为 View 或面板保留的。因此,为什么我的第一个想法是针对应用程序的主框架。

我知道主框架确实存在。我尝试了 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 已设置,正如它应该的那样,但应用程序仍然关闭,这意味着,我认为 Hovercraft 是正确的 - 这不是正确的目标。

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,并且根据我之前的测试,默认的关闭操作实际上被设置为不执行任何操作。那么什么给出呢?我瞄准了正确的框架,它正在正确设置操作,然后它就被忽略了?什么可以覆盖这样的默认关闭操作?

最佳答案

I just need the window to not close when the X is clicked. But the window DOES close.

尝试这个简单的代码

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...

关于java - 如何调试 DO_NOTHING_ON_CLOSE 失败?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23227806/

相关文章:

java - 无法让 selenium 使用 xpath 为我选择按钮。我缺少什么?

java - 如何解决 MalformedJsonException : Unterminated object that exist even after setting JsonReader to lenient

android - 存储访问框架 : keep file permissions after revoke tree permissions

java - BSAF 停止打开数据库连接

java - Firebase Messaging 仅适用于单独的设备

java - 如何让 CommonsPool2TargetSource 池大小根据需要增长?

java - 在 JList 中删除和添加大量项目

java - 编译时出错

java - 如何释放JScrollpane使其不总是拖到底部?

netbeans - 为什么我在 Netbeans 7.1 中找不到 Java 桌面应用程序