2014-02-14 12 views
2

對不起,這肯定是一個非常愚蠢的問題..但我到處都看到Scala代碼示例,您只需在BoxPanel或某個佈局面板上執行 contents +。我想,因爲他們的內容爲mutable.buffer,所以你可以添加和刪除組件。如何使用contents =添加到Scala面板?

但是,如何向Scala Panel添加組件?它接受一個seq,所以你必須給它一個列表或什麼?我知道你可以直接調用peer.add,但我想看看Scala代碼是如何實現的。 :)

例如contents = new Button {}不起作用。

對不起,這個簡單的問題,我很新的斯卡拉..

編輯:

感謝您的答覆。現在我的問題變成了......你能否有一個擴展Panel的課程?你能爲它設置內容嗎?或者從未完成,每個人都只是使用與佈局管理器相關的面板?

回答

3

Panel class本身是抽象的,含義它不能直接實例化,而是作爲面板具體實現的「基礎」。

它似乎並沒有對可能添加成分的「共同」的方法,因爲每個子類都實現了自己的,有時互相不兼容的定製一個

正如你從上面的例子中看到的,很難指定一般的「add」方法在所有這些情況下的含義。

編輯迴應:當然可以的,沒有什麼從自己繼承一個Panel阻止你和覆蓋contents方法,如:

val myPanel = new Panel() { 
        private val myContents = (new Content += new Button()) 
        override def contents = myContents 
       } 

您還可以使用Panel爲一個類型參數的以一般的方式處理面板的方法等。只是你不能有一個實例,它只是只是 a Panel,因爲這個類又是抽象的,所以你不能實例化它。

請注意,這不是斯卡拉獨有的,如果JPanel在Java中是抽象的(如Component是),結果將是相同的。

+0

所以實際上沒有人實際上曾經自己使用Panel類?我們必須使用其具體實現之一? – SonicProtein

+0

@SonicProtein:見編輯。 –

+1

@SonicProtein:看到最終的編輯,前面的子類的例子是不正確的(你需要使用'Content'實例而不是'List',因爲'Content'提供了與對等接口的「魔術」)。 –

1

如果你有一個按鈕:

val button=new Button{ 
    text="Click me!" 
} 
or 

val label=new Label{ 
    text="Look, i'm a label!" 
} 
or 
object myField extends TextField{ columns=2 } 

,那麼你只需使用:

contents=new BoxPanel(Orientation.Vertical){ 
    contents+=button 
    border=Swing.EmptyBorder(10,20,10,20) 
} 

或者更簡單的形式:

contents=new FlowPanel(){ 
    contents+=new Label("This is my button:") 
    contents+=new Button("Click me!") 
    border=Swing.EmptyBorder(10,20,10,20) 
} 
+0

謝謝,但是這是在一個延伸scala.swing.Panel一類?我這樣做,但它不斷說價值contents_ =不是我的類的成員(擴展面板的名稱)。啊,我明白了,你是否設置了scala.swing.Frame的內容? – SonicProtein

+0

是的,這是scala的框架。 –

1