Как отладить ошибку 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...
Другие вопросы по тегам