2014-03-27 45 views
2

我試過四處尋找這個問題,因爲我想它一定是在某個時候被問到的,但這是我能找到的最接近的東西Remove Top-Level Container on Runtime在try塊中放置JDialog是否安全,然後繼續在匹配的finally塊中執行代碼?

我的問題是,它是安全的JDialog執行代碼,已經叫dispose()該對話框後,如果處置是在try完成,正在執行的代碼是在finally做了什麼?

這裏是爲了證明什麼,我問一個例子:

import java.awt.EventQueue; 
import javax.swing.JDialog; 

public class DisposeTestDialog extends JDialog { 
    private final String somethingToPrint; 

    public DisposeTestDialog(String somethingToPrint) { 
     this.somethingToPrint = somethingToPrint; 
    } 

    public void showAndDispose() { 
     setVisible(true); 
     // Do something 
     setVisible(false); 
     try { 
      dispose(); 
     } 
     finally { 
      System.out.println(somethingToPrint); 
     } 
    } 

    public static void main(String[] args) { 
     EventQueue.invokeLater(new Runnable() { 
      @Override 
      public void run() { 
       DisposeTestDialog dialog = new DisposeTestDialog("Can this be safely printed?"); 
       dialog.showAndDispose(); 
      } 

     }); 
    } 
} 

從我所知道的dispose()過程中,和finally塊,我會說,如果不是一個好主意,應該很好地工作。確實運行上面的代碼確實成功打印。

雖然GC可能會在try/finally之間開始並導致一些問題嗎?

+0

如果您需要讓您的課程保持持久性,請不要擴展JDialog。使用一個JDialog。當你想重載某個組件方法時,只擴展一個Swing組件。 –

+0

@GilbertLeBlanc是的,這是真的只爲這個例子。我的實際用例大不相同。 –

回答

1

不,只要您只訪問非圖形對象(例如您的示例中的字符串)。

+0

所以你說只要我不做一些可以訪問Dialog框架的一部分,那麼我應該沒問題? –

相關問題