2014-02-15 43 views
0

這個book似乎暗示事件是事件案例類的一個實例。在Scala中,如何通過MouseEvent對象上的模式匹配來檢查特定組件是否被點擊?

「例如,按壓按鈕將創建的事件是以下情況下的類的一個實例: 情況下類ButtonClicked(源:按鈕)」

1)Applyin這個邏輯,確實這意味着,按下鼠標將創建的事件是以下情況下類?:

case class MousePressed(source: Component, point: java.awt.Point, modifiers: Modifiers, clicks: Int, triggersPopup: Boolean)(peer: java.awt.event.MouseEvent) 

2)做圖案的物體上的匹配,以檢測是否一個特定的成分已被按下鼠標的一個實例,這是 碼是否正確?:

listenTo(mouse.clicks) 
    reactions += { 
    case MousePressed(nameOfComponent,_,_,_,_) => //some code you want to execute in response to that component being pressed // 
    } 

3)和我同時也是正確的思想,其他參數可以進行檢查爲好,例如說

case MousePressed(nameOfComponent,point,modifier,3,true) 

是個非常特殊的模式:一個特定組成部分在某個特定點上使用某個修飾符,在第三次點擊時觸發彈出窗口? (這可能不是很實用)

4)Modifier參數有什麼作用?

+0

錯誤...這次不是真的跟着你。構造函數定義*如何創建一個對象 - 關於「多少」,它總是每個構造函數*調用*。只是對於case類,您會得到一個「免費」提取器,它可以爲您提供與類的默認構造函數相對應的可能的模式匹配 - 但這些通常是獨立的。 –

+0

我似乎對自己感到困惑..對不起,我不知道API中的MousePressed案例類的頭文件,並且一直在圈出。這本書的引用(上圖)對我來說很困惑。我現在修改了這個問題..希望最後一塊代碼是正確的? – SonicProtein

+0

現在更好的問題,但說實話,你可能已經得到了答案。 3)自己。我並不試圖阻止你提出問題 - 相反,我想鼓勵你不要害怕嘗試:)。 –

回答

1

1)它將創建的scala.swing.event.MousePressed一個實例。正如我在評論中所說的,在初始化過程中使用的構造函數並不重要,它將是具有相同字段的同一個類。唯一的區別是你有一個對應於主構造函數的模式,因爲它是一個case類。

2)正式你是正確的 - 特別是在這種情況下,你說:

  • 「爲這個組件」,
  • 「捕捉任何MousePressed事件,並給我訪問component場通過nameOfComponent(我不關心其餘的)。「

實際上像您期望你的代碼將無法正常工作,因爲在Swing中的事件處理程序每​​個組件註冊,似乎斯卡拉鞦韆遵循的模式。這意味着除非你明確地說,否則你只會從你使用listenTo的零件mouse模塊獲取事件 - 並且沒有其他零件,甚至不是兒童

因此,如果你想,例如要收聽組件本身及其直接兒(兒兒的),你想補充:

contents.foreach(child => listenTo(child.mouse.clicks)) 

當然,這是標準Scala代碼 - 我會離開它給你適應它符合你的需求。

最後,對於這一點 - 通常最好爲特定組件的特定事件定義模式匹配,而不是「常規」處理程序 - 後者解決方案僅在少數情況下有用,如製作自定義組件。

3)正確,在這裏你說「我想匹配MousePressed,給我通過變量nameOfComponentpoint訪問componentpointmodifier領域,並modifier我想匹配的事件有clicks == 3triggersPopup == true「。最後兩個被稱爲恆定模式

4)這是一個單獨的問題,但我會咬,這次。它們是the same thing as in Java's Swing - 這是存儲與事件相關的標誌的專用字段。它們甚至與Java中的類型相同 - Modifiers is a type alias for Int。基本上,這些是傳達關於事件的其他信息的數字。例如,如果你想檢查這是否是左鍵點擊,你可以使用:

import java.awt.event.{InputEvent => AWTEvent} //so that we don't confuse it with the Scala class 

... 

case MousePressed(_,_,AWTEvent.BUTTON1_DOWN_MASK,_,_) => ... 
0

您可以使用下面的代碼來打印一條線,告訴您單擊鼠標的位置。

listenTo(mouse.clicks) 
    reactions += { 
    case e:MousePressed => println("press "+e.point) 
} 
相關問題