2010-12-10 65 views
0

Je suis en train de créer une fenêtre Vaadin avec une barre de menu en utilisant Scala. J'obtiens une erreur de compilation qui indique que l'importation com.vaadin.ui.MenuBar.MenuItem est introuvable. Je l'ai regardé à la bibliothèque Vaadin (6.4.8), et il semble que la classe est là:pourquoi ne pas reconnaître scala com.vaadin.ui.MenuBar.MenuItem

com/vaadin/ui/MenuBar$Command.class 
com/vaadin/ui/MenuBar$MenuItem.class 
com/vaadin/ui/MenuBar.class 

Voici la structure de classe de la source MenuBar:

@SuppressWarnings("serial") 
@ClientWidget(value = VMenuBar.class, loadStyle = LoadStyle.LAZY) 
public class MenuBar extends AbstractComponent { 
    ... 
    public interface Command extends Serializable { ... } 
    public class MenuItem implements Serializable { ... } 

} 

Aux fins de démonstration , voici un échantillon de classe Scala:

import com.vaadin.Application 
import com.vaadin.ui.Button 
import com.vaadin.ui.Window 
import com.vaadin.ui.MenuBar 
import com.vaadin.ui.MenuBar.Command 
import com.vaadin.ui.MenuBar.MenuItem 

class MyVaadinApplication extends Application 
{ 

    private var window : Window = null 

    override def init() = 
    { 
     window = new Window("My Scala Vaadin Application") 
     setMainWindow(window) 
     window.addComponent(new Button("Click Me")) 
    } 

} 

Et voici l'erreur résultant lorsque je tente de le compiler:

/Users/jstanford/Development/NetBeansProjects/TraderDashboard/src/main/scala:-1: info: compiling 
Compiling 2 source files to /Users/jstanford/Development/NetBeansProjects/TraderDashboard/target/classes at 1291973683915 
[ERROR]MyVaadinApplication.scala:7: error: MenuItem is not a member of com.vaadin.ui.MenuBar 
import com.vaadin.ui.MenuBar.MenuItem 
    ^

Quelqu'un peut-il trouver le problème ici?

Merci, John

Répondre

4

Les classes internes ne peuvent pas être importées comme d'habitude pour Java. Il suffit de spécifier les projections de type comme cela est fait pour Button # Type ClickEvent:

import com.vaadin._ 
import ui._ 
import Button._ 

class MyScalaVaadinApplication extends Application { 
    val window = new Window("My Vaadin Application") 

    def init { 
    window.addComponent(new Button("Click Me", new ClickListener { 
     def buttonClick(clickEvent: Button#ClickEvent): Unit = window.showNotification("Just a message") 
    })) 

    setMainWindow(window) 
    } 
} 
+0

Merci. Je pensais que c'était quelque chose de simple ... – jxstanford

1

Un exemple très simple montrant ce qui se passe.

Java:

package a; 
public class Outer { public class Inner {} } 

Scala:

import a.Outer 
import a.Outer.Inner // causes *Inner is not a member of a.Outer* 

Notez que intérieur, comme MenuBar.MenuItem, est une classe interne non-statique et en tant que telle est associée à une instance de Extérieur. Mais Scala nous permet d'importer intérieur en utilisant une instance de externe:

import a.Outer 
import a.Outer.Inner 

object dummy { 
    val o = new Outer 
    val o2 = new Outer 
    import o.Inner 
    val i = new Inner 
    val i2 = new o2.Inner 
} 

Si nous pouvions import a.Outer.Inner comment le compilateur sait à quelle instance de externe est intérieur censé appartenir?

Espérons que le problème a été résolu.