Я новичок Scala, который играет с scala-swing. И хотите перевести данный scala.swing.Point
на scala.swing.event.MousEvent
:Scala; Выражение типа (X) => X не соответствует типу SupX
Я хочу отправить событие мыши классу, ответственному за обработку фигур. Но поскольку форма имеет местоположение относительно его контейнера (лист), но MouseEvent.point относительно окна, я должен перевести/релятивизировать его раньше.
Итак, у меня есть класс, который Selection
получить MouseEvent
S:
case class Selection(sheet:Sheet) {
def on(event:Event) = event match {
case clicked:MouseClicked => {
clicked.modifiers match {
case scala.swing.event.Key.Modifier.Control =>
sheet.getItemAt(clicked.point).map(addToSelection)
case _ =>
sheet.getItemAt(clicked.point).map(setSelection)
}
}
}
}
Sheet
И кто его контейнер фигур (и знаю, как перевести точки).
class Sheet extends Component {
private val selection = Selection(this)
listenTo(mouse.clicks, mouse.moves)
reactions += {
case e:MousePressed => selection.on(translate(e))
case e:MouseClicked => selection.on(translate(e))
}
/** Here is my problem :
* > Expression of type (MouseEvent) => MousePressed doesn't conform to expected type Event
*/
def translate(original: MouseEvent): Event = original match {
case pressed:MousePressed =>
pressed.copy(point=relativize(pressed.point))
case clicked:MouseClicked =>
clicked.copy(point=relativize(pressed.point))
case other:MouseEvent=>
other
}
}
я могу обойти эту проблему с некрасивым гипсом:
case pressed:MousePressed =>
pressed.copy(point=relativize(pressed.point)).asInstanceOf[MousePressed]
Но у меня есть еще более странная проблема компилятора:
Error:(32, 21) missing arguments for method copy in class MousePressed; follow this method with `_' if you want to treat it as a partially applied function
pressed.copy(point = relativize(pressed.point)).asInstanceOf[MousePressed]
И здесь, я потерял и потребность вам поможет сделать это простое преобразование.
Конечно все методы используют scala.swing._
типов (и никогда не смешивается между scala.swing. and
java.awt. `)
Спасибо большого
Большое спасибо. И это устраняет необходимость кастинга (которого требовал мой Идей, у которого были проблемы, чтобы разобрать это неправильное выражение) –