Как отладить ошибку DO_NOTHING_ON_CLOSE?
В свинг-приложении я, насколько я понимаю, рассказал 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. Но окно закрывается.
Эта операция кажется настолько простой, что я даже не могу придумать, как ее отладить. Я пропускаю что-то СУПЕР очевидное?
Изменить: А вот метод getApplication в классе SurveyApp:
public static SurveyApp getApplication() {
return Application.getInstance(SurveyApp.class);
}
Edit2: поскольку HoverCraft предполагает, что mainFrame не является виновником, возможно, обзор структуры приложения укажет нам правильное направление. Все приложение содержится в одном JPanel, mainPanel
, Панель, в свою очередь, содержится внутри public class SurveyView extends FrameView
, Все мои компоненты добавляются на панель, которая представляет собой макет карты, который циклически перебирает несколько других JPanels. Насколько я понимаю, операции закрытия зарезервированы для фреймов, а не для представлений или панелей. Поэтому моя первая мысль была направлена на основной фрейм приложения.
Я знаю, что основной кадр существует. Я старался 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, и, исходя из моего предыдущего теста, операция закрытия по умолчанию фактически настроена на ничего не делать. Так что же дает? Я нацеливаю правильный кадр, он правильно устанавливает операцию, а затем просто игнорируется? Что может переопределить операцию закрытия по умолчанию, подобную этой?
1 ответ
Мне просто нужно, чтобы окно не закрывалось при нажатии 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...