2009-07-16 93 views
8

爲了響應previous question關於如何使用Swing實現特定效果,我被引導至JDesktopPane和JInternalFrame。不幸的是,scala.swing似乎沒有任何類的封裝,所以我只剩下擴展它。如何擴展scala.swing?

我該怎麼知道和做什麼才能使這些類的最小可用包裝,與scala.swing一起使用,以及使用其中大部分步驟的額外步驟是什麼?

編輯:

至於建議的人,讓我解釋一下我打算達到的效果。我的程序控制(個人)彩票投注。所以我有很多不同的門票,每個門票都可以有不同的賭注和不同的有效性。

這個想法是在一個單獨的「空間」中顯示每個票據,並且JInternalFrames似乎正是我想要的,並讓人們創建新票據,從文件加載它們,將它們保存到文件中,並且通常檢查或編輯每個中的信息。

除此之外,還需要一個空間來顯示彩票結果,我打算髮展該項目以控制集體投注 - 誰貢獻了多少,以及如何分配勝利。我還沒有考慮過這個界面。

請注意:

  • 我不能「只使用」的Java類,還充分利用Scala的揮杆特徵。在上一個問題中的答案已經告訴我如何去做我想要的Java類,而這不是我在這裏問的。

  • 閱讀現有的scala.swing類的源代碼來學習如何做到這一點,我試圖避免這個問題的工作。

回答

0

您可以直接將所有java庫導入到您的scala代碼中。

嘗試scala教程部分:「與Java的交互」。

Java in scala

0

你想用什麼樣的scala功能?這可能有助於提出一個答案。即 - 你試圖用Java做什麼?然後我們可以試着想出一個更好的方式來使用Scala來實現它,並且/或者爲這些類創建一個包裝器,這會讓你試圖做的更容易。

+0

不夠公平。我會推薦我的問題。 – 2009-07-18 15:02:27

+0

感謝您的額外信息,但我的意思是在更技術層面 - 即以編程方式,您想用Swing課程做什麼? – 2009-07-19 10:04:43

3

您可能會考慮Scala的「隱式轉換」機制。你可以做這樣的事情:

implicit def enrichJInternalFrame(ji : JInternalFrame) = 
       new RichJInternalFrame(ji) 

現在定義一個類RichJInternalFrame(),這需要的JInternalFrame,並有你喜歡的任何方法的JInternalFrame與延伸,例如:

class RichJInternalFrame(wrapped : JInternalFrame) { 
    def showThis = { 
    wrapped.show() 
    } 
} 

這創建一個新的方法showThis,它只是調用JInternalFrame上的顯示。現在,您可以調用此方法上的JInternalFrame:

val jif = new JInternalFrame() 
println(jif.showThis); 

斯卡拉將自動轉換JIF成RichJInternalFrame,讓你在其上調用此方法。

0

在JRuby中,您可以將一個(或多個)特徵混合到JDesktopPane或JInternalFrame中,而不是擴展它們。這樣你就不必包裝類,只需要使用現有的對象。據我所知,這是不可能與斯卡拉特徵。

幸運的是,有一種解決方案,幾乎和Ruby的一樣靈活:lexically open classes。這篇博客文章給出了一個很好的介紹,恕我直言。