2009-12-20 41 views
0

好吧,我不是一個Java noob,它只是偶爾發現我忘記了一些關於核心Java的東西,而我正在學習更多有趣的東西,比如MySQL,Servlets,Java EE,JDBC等等。所以不要像我是初學者那樣來形容你的答案。現在的問題.....有關在類中擴展JFrame的問題?

我正在寫一個類(可以說是ThisIsAJFrameExtendingClass),它擴展了JFrame,並最大限度地減少了與我的整體項目混淆,我也想在ThisIsAJFrameExtendingClass停放一些其他實用方法。我打算這個類(ThisIsAJFrameExtendingClass)尋求用戶的某些輸入,自殺(即dispose())。所以,我的問題是,如何在沒有任何JFrame彈出用戶屏幕的情況下獨立使用該類中的實用程序方法。

我喜歡在ThisIsAJFrameExtendingClass類中使用多個構造函數的幫助下的解決方案,其中調用無參數構造函數返回JFrame並使用布爾參數調用第二個構造函數以訪問實用程序方法。

[UPDATE]

喔....我只是有一個想法,該實用程序方法具有的ArrayList返回類型所以,假設該實用程序的方法被稱爲utilMethod()然後:

ArrayList<String> pring = new ThisIsAJFrameExtendingClass().utilMethod();

將上面的代碼輸出任何JFrame?

回答

1

您可以製作實用方法static,在這種情況下,可以使用ThisIsAJFrameExtendingClass.<method name>調用它們而不創建實例。

有關構造函數的東西對我來說並沒有什麼意義。一個類的構造函數總是返回該類的一個實例。它不能返回「別的東西」,因爲一個參數的你在通過

[編輯,以應對問題的更新]:

new ThisIsAJFrameExtendingClass()將創建類的實例,運行它的構造(和所有超類的默認構造函數)。這可能會分配繼承樹中每個構造函數所需的其他資源(例如其他Swing組件或其他資源)。因此,創建了一個JFrame,但如果您只呼叫utilMethod()並且從不掛在對幀的引用上,它將被垃圾收集,並且其資源將在某個時間點釋放。

創建一個JFrame實例來調用它的一個實用工具方法並不是特別有效的方法,但它不會導致任何問題。 (如Chad所述,默認情況下,JFrame不可見,所以如果您在「util」模式下使用它,用戶將看不到任何東西)。

至於返回ArrayList,作爲使用集合時的一般規則,您應該返回有意義的最高級接口而不是具體的類。因此在這種情況下,請考慮返回List<String>甚至Collection<String>

+0

是的,是我不好,就像我在這個問題提到的,我有點忘了不少關於'inheritance'在覈心Java,因爲我忙於其他事情 – Catfish 2009-12-20 15:10:11

0

好吧,讓我們假設你需要的方法不是靜態的。

在這種情況下,請記住,除非您調用setVisible(true),否則JFrame不會顯示出來;所以只要確保你永不顯示框架,並且你可以使用任何你想要的功能,而不會讓用戶煩惱。

1

我的背後隱藏着很多麻煩,這聽起來有點讓我困惑。至少,這聽起來像可怕的設計。但我有一些建議:

  1. 您可以使這些實用方法是靜態的,那麼您將不需要實例化您的類就可以使用它們。這將是最簡單的情況。
  2. 您可以將您的實用方法打包到您的框架的靜態內部類中,這基本上可以讓您滿足每個文件只有一個類的要求。

最後,你只是想讓JFrame消失,一旦用戶完成它,或者你想終止應用程序? dispose()只會做前者,你的應用會繼續作爲一種無頭殭屍進程運行。

+0

就像我之前提到的問題,我已經忘記了很多關於核心Java,因此,錯誤的概念 – Catfish 2009-12-20 12:50:44

+0

dispose()方法,將退出JVM,如果幀被處置是在JVM上運行的唯一框架。 – camickr 2009-12-20 16:52:41

+0

@camickr:很酷,不知道。謝謝! – 2009-12-20 18:12:21

0

或者你可以正確地設計它,打出來的實用方法到一個單獨的類...

+0

不,我已經有一個困惑的項目組織,並不熱衷於增加項目的複雜性,甚至更多 – Catfish 2009-12-20 15:08:44