gpt4 book ai didi

java - 如何调试 DO_NOTHING_ON_CLOSE 失败?

转载 作者:行者123 更新时间:2023-12-01 23:03:00 24 4
gpt4 key购买 nike

据我了解,在 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/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com