2010-03-02 2 views
16

я подал заявку, и мне нужно, чтобы сохранить некоторые параметры перед выходом (. Что-то вроде размер окна, ..., которые будут записаны в файл)Как сохранить параметры приложения перед выходом? .

Основной кадр установить это:

frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); 

Как я могу сохранить параметры, которые меня интересует? (перед выходом из курса)

Спасибо!

ответ

28

Если вы просто хотите что-то сделать, когда приложение закрывается, вы можете подключить выключение с помощью t его код:

Runtime.getRuntime().addShutdownHook(new Thread(new Runnable() { 

     public void run() { 
      // Do what you want when the application is stopping 
     } 
    })); 

Однако это не позволит вам закрыть окно. Если вам нужно кое-что проверить, прежде чем действительно выход, вы можете переопределить windowClosing событие:

addWindowListener(new WindowAdapter() { 
    public void windowClosing(WindowEvent e) { 
     // Do what you want when the window is closing. 
    } 
}); 

Обратите внимание, что первое решение - с помощью выключения крючок - имеет то преимущество, что оно не связано с событием окна, и будет выполняться, даже если приложение остановлено другим событием (за исключением, конечно, если процесс Java убит жестоко).

+0

Когда я использовал конструктор Thread(), был поврежден файл, который был сохранен в методе Thread.run(). Но когда я использовал конструктор Thread (Runnable), как было предложено в этом примере, файл был сохранен правильно. Было ли мне повезло или что тип конструктора имеет значение? – ka3ak

+0

Это также очень полезно при обработке апплетов. При выходе из них void stop() не всегда вызывается, тогда как этот метод. Благодаря! : D – Daan

+0

За исключением случаев, когда вы используете обработчик IDE и завершаете эскиз с помощью кнопки «Стоп», и в этом случае даже этот метод не работает. – rednoyz

1

Вы можете зарегистрировать WindowListener и сохранить ваши варианты в методе WindowClose.

И конечно

frame.setDefaultCloseOperation(JFrame.DO_NOTHING_ON_CLOSE); 
4

Может быть следующее поможет.

  1. Сначала вам необходимо прочитать ваш файл о недвижимости. See doc

    Properties properties = new Properties(); 
    try { 
        properties.load(new FileInputStream("filename.properties")); 
    } catch (IOException e) { 
        System.err.println("Ooops!"); 
    } 
    
  2. Второй добавить обработчик событий в окне, которое будет сохранять данные в собственности file.All, что вам нужно сохранить только поместить в свойства экземпляра и сохранить его на выходе

    addWindowListener(new WindowAdapter() { 
        public void windowClosing(WindowEvent e) { 
        try { 
        properties.store(new FileOutputStream("filename.properties"), null); 
        } catch (IOException e) { 
        } 
        } 
    }); 
    

Вот и все, если бы я понял вас правильно)

+11

Просьба ** ** ** иметь пустые блоки блокировки, даже в примере кода. Поместите хотя бы 'e.printStackTrace()' там. Пример кода имеет неприятную тенденцию стать производственным кодом, и мы все должны это подтвердить позже. –

+0

На самом деле это было не мое), просто быстрая копия/прошлое. Но ты абсолютно прав. – ponkin

0

Не уверен, что это относится к вашей ситуации, но это может быть для других, кто занимается серфингом в этой теме. Мое приложение имеет основной() и в конце имеет цикл while (! Shell.isDisposed). Когда приложение запускает этот цикл, и когда приложение закрывается, этот цикл заканчивается и он падает до того, что когда-либо происходит после него в основном методе. Вот где я поставил чек, если редактор загрязнен, и если настройки изменились и обработали эти условия. Мой метод, прикрепленный к файлу close, устанавливает оболочку и вызывает метод closeCurrent(), но если кто-то нажимает значок «закрыть» окна «x», он попадает сюда, и я снова проверяю, что что-то грязное, и сохраните, если нужно.

while (!shlCpbtool.isDisposed()) { 
     if (!display.readAndDispatch()) { 
      display.sleep(); 
     } 
    } 
    // exit 
    if(dirty){ 
     closeCurrent(); 
    }