2015-07-20 3 views
0

Я новичок 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. `)

Спасибо большого

ответ

1

Что касается проблемы компилятора, вы можете понять, что жаловаться о просмотре документации MouseEvent (и, в частности, MousePressed).

Класс случае определяется с двумя списками параметров, со следующей упрощенной подписью

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

Как вы можете видеть, что есть второй список параметров ожидая peer объекта, который является базовым объектом Java Swing. Вы можете получить доступ к экземпляру peer с помощью атрибута с тем же именем (например, pressed.peer)

copy метод, генерироваться по определению случая класса, вероятно, ожидает, что этот второй параметр, как этот

pressed.copy(point = relativize(pressed.point))(pressed.peer) 

Со вторым список параметров отсутствует, то компилятор выводя, что вы хотите, чтобы частично применить метод copy, таким образом, он предлагает использовать синтаксис

pressed.copy(point = relativize(pressed.point) _ 

для partially applying функция fory

+0

Большое спасибо. И это устраняет необходимость кастинга (которого требовал мой Идей, у которого были проблемы, чтобы разобрать это неправильное выражение) –

Смежные вопросы