据我了解,在一个摇摆应用程序中,我将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,并且根据我之前的测试,默认的关闭操作实际上被设置为什么都不做。那么给了什么?我的目标是正确的框架,它正在正确设置操作,然后它就被忽略了?什么可以覆盖这样的默认关闭操作?