2013-08-20 1 views
7

Я знаю, что этот вопрос появляется довольно часто в SO, как here: , но я хотел бы представить несколько очень конкретных примеров ... Я просто не уверен, что я делаю вещи правильно.Возвращаемая стоимость от JDialog; dispose(), setVisible (false) - пример

У меня есть JDialog, в котором я могу ввести некоторые значения, выбрать некоторые флажки ... независимо ... У меня есть также объект Response, созданный в MyDialog, который представляет собой «ответ» MyDialog.

В JFrame, который вызывает/создает JDialog:

MyDialog d = new MyDialog(this, ...); 
d.showDialog(); 
// After MyDialog is closed (it's modal): 
MyDialog.Response dialogResponse = d.getDialogResponse(); 
// Do something with response... 

В Dialog (Диалог можно закрыть, нажав кнопку "Сохранить"):

btnSave.addActionListener(new ActionListener() { 
    @Override 
    public void actionPerformed(ActionEvent e) { 
     dialogResponse = prepareResponse(); // prepares response on the basis of some data introduced by a user; dialogResponse is called from JFrame after Dialog is closed 
     setVisible(false); 
     dispose(); // <-- Important 
    } 
}); 

Мой вопрос: Это решение работает, Я имею в виду, что строка MyDialog.Response dialogResponse = d.getDialogResponse(); возвращает правильные значения, но ... , если я закрою диалог с помощью утилиты(), все ресурсы диалога могут быть собраны в мусор (не нужно ... трудно предсказать, правильно?) , Так правильно ли получить ответ моего диалога так? Может быть, в этом случае я должен написать только setVisible(false); без dispose().

+0

Если вам нужно, чтобы ваш 'JDialog' позже не утилизировал его и просто использовал' setVisible (false) ', в противном случае вы можете утилизировать его без каких-либо проблем. – Paniz

+0

Не уверен, что я понимаю, следовательно комментарий, но не может вы удаляете диалог из рамки? – npinti

+0

@ npinti Да, но мне в основном любопытно, могу ли я получить доступ к ответу моего диалога после того, как dispose() вызывается на Dialog –

ответ

7

Цитируется Javadocs:

Окна и его подкомпоненты можно отображаемые вновь восстанавливая собственные ресурсы с последующим вызовом для упаковки или шоу. Состояние обновленного окна и его подкомпонентов будет идентичным состояниям этих объектов в точке, где было установлено Окно (не учитывающие дополнительные изменения между этими действиями).

Итак, ваш ответ будет сохранен. Все dispose() действительно освобождает ресурсы собственного экрана, другие члены не помечены для сбора мусора.

Кроме того, если вы хотите быть уверенным, вы можете просто позвонить dispose() сразу после того, как вы получили объект ответа.

3

если я закрыть диалоговое окно, используя Dispose(), ресурсы все диалоговые может быть мусора (не надо ... трудно предсказать, я прав?). Итак, правильно ли получить ответ моего диалога так ... Может быть, в этот случай я должен написать только setVisible (false); без dispose().

-1

почему вы не используете переменные класса (частных статических или публичный статический) и использовать заводской метод

//it can be an object too public static Object getResponseValue() 
    public static Integer getResponseValue(){ 
    myclassContainer container = new myclassContainer(someparent,modal).setvisible(true) 
    return  Myfieldvalue 
    } 

    private static int Myfielvalue; 

} 
+0

??? ясно, я пропустил часть здесь .... приходят на переменные класса, они хороши, они необходимы, поэтому у нас есть они, константы фабричных методов, такие как jdialogs butons, которые вы должны прочитать далее – GoAntonio

-1
 dialog.add(BorderLayout.CENTER, tree_tmp); 
     JButton confirm = new JButton("YES"); 
     confirm.addActionListener(new ActionListener() { 

      @Override 
      public void actionPerformed(ActionEvent e) { 
       confirm.setActionCommand("kkk"); 
       dialog.setVisible(false); 
      } 
     }); 
     dialog.add(BorderLayout.SOUTH,confirm); 
     dialog.setSize(400, 400); 
     dialog.setVisible(true); 

     System.out.println(confirm.getActionCommand()); 
+0

Только ответы на код без объяснения причин часто помечены и удалены. –