2015-07-20 2 views
0

Je suis un débutant scala qui joue avec scala-swing. Et je veux traduire un scala.swing.Point donné :Scala; Expression de type (X) => X n'est pas conforme au type SupX

Je voudrais envoyer l'événement de la souris à une classe responsable de gérer les sélections de formes. Mais parce qu'une forme a un emplacement par rapport à son conteneur (feuille) mais MouseEvent.point est relatif à la fenêtre que je devrais traduire/relativiser auparavant.

Donc, j'ai une classe Selection qui reçoivent 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) 
     } 
    } 
    } 
} 

Et Sheet qui est son conteneur de formes (et savoir comment traduire les points).

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 
    } 
} 

Je peux contourner ce problème avec un casting laid:

case pressed:MousePressed => 
     pressed.copy(point=relativize(pressed.point)).asInstanceOf[MousePressed] 

Mais j'ai un autre problème de compilateur plus étrange:

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]

Et ici, je suis perdu et le besoin votre aide pour faire cette conversion simple.

Bien sûr, toutes les méthodes utilisent scala.swing._ types (et ne se mélange entre scala.swing. and java.awt. `)

Merci beaucoup

Répondre

1

En ce qui concerne le problème du compilateur, vous pouvez comprendre ce qui se plaindre à propos de la documentation MouseEvent (et plus précisément MousePressed).

La classe de cas est définie par deux listes de paramètres, avec la signature simplifiée

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

Comme vous pouvez le voir, il y a une deuxième liste de paramètres attend l'objet peer, qui est l'objet java swing sous-jacente. Vous pouvez accéder à l'instance peer en utilisant l'attribut du même nom (par exemple pressed.peer)

La méthode copy, générée par la définition de classe de cas, attend probablement ce second paramètre, comme celui-ci

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

Avec la deuxième liste des paramètres manquants, le compilateur est que vous souhaitez infère appliquer partiellement la méthode copy, donc vous suggère d'utiliser le

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

syntaxe pour partially applying la fonction curry

+0

Merci beaucoup. Et cela supprime le besoin de lancer (qui était exigé par mon Id qui avait des problèmes pour analyser cette mauvaise expression) –