尝试在 ScalaFx 中绑定鼠标事件侦听器时出现编译错误
Compile error trying to bind mouse event listener in ScalaFx
我正在编写一个小测试应用程序,它在 Scala 中使用 Canvas
class 和 scalafx
。问题在于:
gui.canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}
抛出错误:
[error] E:\dev\sg\src\main\scala\Test.scala:27: type mismatch;
[error] found : scalafx.scene.input.MouseEvent => Unit
[error] required: _2.HandlerMagnet[javafx.scene.input.MouseEvent,?]
where val _2: scalafx.scene.canvas.Canvas
[error] a: MouseEvent => {
[error] ^
我不明白为什么这个完全相同的片段出现在方法 setupGraphics
中时可以编译,但当它出现在 Main
对象的代码中时却不能编译。
顺便说一句,浏览了相当多的 ScalaFX 代码后,我有点头晕,因为我看到了很多不同的绑定事件的方法,有 the one I'm using, setting the onMouseClicked variable (with and without a first class function), using filterEvent。此外,对于每个,您都可以使用匿名函数或创建事件处理程序对象。
在所有这些中,这是唯一在此示例中起作用的;在这种情况下,尝试创建 EventHandler[MouseEvent]
并覆盖 handle()
也会失败。
我正在使用 Scala 2.10.5
完整来源:
object Test {
import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.stage.Stage
import scalafx.scene.Scene
import scalafx.scene.canvas.Canvas
import scalafx.scene.canvas.GraphicsContext
import scalafx.scene.input.MouseEvent
import scalafx.event.EventHandler
class GUI(val canvas:Canvas
,val stage: Stage
,val gc: GraphicsContext){}
object Main extends JFXApp {
var gui=setupGraphics()
gui.canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}
def setupGraphics():GUI={
val canvas = new Canvas(400, 400)
canvas.translateX=0
canvas.translateY=0
val gc = canvas.graphicsContext2D
canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}
stage = new PrimaryStage {
title = "asd"
height = 600
width = 800
scene=new Scene{content=canvas}
}
return new GUI(canvas,stage,gc)
}
}
}
在我看来,这就像是 Scala 编译器中的错误,尤其是您可以通过使用 canvas
的中间变量来更正此错误,而无需修改任何其他内容。不要调用 gui.canvas.handleEvent
,而是先将 canvas
赋值给一个变量,然后对其调用 handleEvent
:
var gui=setupGraphics()
val canvas = gui.canvas
canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}
我正在编写一个小测试应用程序,它在 Scala 中使用 Canvas
class 和 scalafx
。问题在于:
gui.canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}
抛出错误:
[error] E:\dev\sg\src\main\scala\Test.scala:27: type mismatch;
[error] found : scalafx.scene.input.MouseEvent => Unit
[error] required: _2.HandlerMagnet[javafx.scene.input.MouseEvent,?]
where val _2: scalafx.scene.canvas.Canvas
[error] a: MouseEvent => {
[error] ^
我不明白为什么这个完全相同的片段出现在方法 setupGraphics
中时可以编译,但当它出现在 Main
对象的代码中时却不能编译。
顺便说一句,浏览了相当多的 ScalaFX 代码后,我有点头晕,因为我看到了很多不同的绑定事件的方法,有 the one I'm using, setting the onMouseClicked variable (with and without a first class function), using filterEvent。此外,对于每个,您都可以使用匿名函数或创建事件处理程序对象。
在所有这些中,这是唯一在此示例中起作用的;在这种情况下,尝试创建 EventHandler[MouseEvent]
并覆盖 handle()
也会失败。
我正在使用 Scala 2.10.5
完整来源:
object Test {
import scalafx.Includes._
import scalafx.application.JFXApp
import scalafx.application.JFXApp.PrimaryStage
import scalafx.stage.Stage
import scalafx.scene.Scene
import scalafx.scene.canvas.Canvas
import scalafx.scene.canvas.GraphicsContext
import scalafx.scene.input.MouseEvent
import scalafx.event.EventHandler
class GUI(val canvas:Canvas
,val stage: Stage
,val gc: GraphicsContext){}
object Main extends JFXApp {
var gui=setupGraphics()
gui.canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}
def setupGraphics():GUI={
val canvas = new Canvas(400, 400)
canvas.translateX=0
canvas.translateY=0
val gc = canvas.graphicsContext2D
canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}
stage = new PrimaryStage {
title = "asd"
height = 600
width = 800
scene=new Scene{content=canvas}
}
return new GUI(canvas,stage,gc)
}
}
}
在我看来,这就像是 Scala 编译器中的错误,尤其是您可以通过使用 canvas
的中间变量来更正此错误,而无需修改任何其他内容。不要调用 gui.canvas.handleEvent
,而是先将 canvas
赋值给一个变量,然后对其调用 handleEvent
:
var gui=setupGraphics()
val canvas = gui.canvas
canvas.handleEvent(MouseEvent.MouseClicked){
a: MouseEvent => {
println("Mouse pos:" + a.sceneX+ " " + a.sceneY)
}
}