2013-08-20 59 views
7

我知道,這個問題似乎很常見,像here: 但我想提出一些非常具體的例子...我只是不確定是否我做的東西對。從JDialog返回值;處置(),setVisible(false) - 示例

我有一個JDialog,我可以在其中鍵入一些值,選擇一些複選框...無論什麼... 我也有一些響應對象在MyDialog中創建,它代表MyDialog的「答案」。

在JFrame中它調用/創建的JDialog:

​​3210

對話框(對話框可以通過點擊 「保存」 按鈕關閉):

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();返回適當的值,但... 如果我使用dispose()關閉對話框,所有對話框的資源都可以被垃圾收集(不必很難預測,對嗎?) 。所以,以這種方式檢索我的對話框響應是正確的......也許在這種情況下,我應該只寫setVisible(false);而不使用dispose()

+0

如果你需要你的'JDialog',以後不要配置它,只需使用'setVisible(false)',否則你可以毫無問題地處置它 – Paniz

+0

不知道我理解,因此評論,但不能你從框架中處理對話框? – npinti

+0

@npinti是的,但我主要是好奇,如果我可以訪問我的對話框的迴應後dispose()調用對話框 –

回答

7

Javadocs引用:通過與隨後調用pack或show重新構造本機資源

的Window及其子組件,可重新顯示。 重新創建的Window及其子組件的狀態將與這些對象在處理該窗口的位置處的狀態相同(不考慮這些操作之間的額外修改)。

因此,您的迴應將被保留。所有dispose()都會釋放本機屏幕資源,其他成員未標記爲垃圾收集。

此外,如果您想額外確保,您可以在檢索到響應對象後立即致電dispose()

3

如果我使用dispose()關閉對話框,則所有對話框的資源都可以是 垃圾回收(不必非得難以預料,對嗎?)。所以 是正確的檢索我的對話框的迴應這樣...也許在 這種情況下,我應該只寫setVisible(false);無需處置()。

-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

代碼只有答案沒有解釋經常被標記和刪除。 –