2010-12-10 90 views
0

我试图用Scala创建一个带有MenuBar的Vaadin窗口。我收到一个编译器错误,指出无法找到com.vaadin.ui.MenuBar.MenuItem导入。我已经看过了Vaadin库(6.4.8),看来这个类有:为什么不能scala识别com.vaadin.ui.MenuBar.MenuItem

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

下面是从菜单栏源类结构:

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

} 

为了演示,这里有一个样品的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")) 
    } 

} 

而这里所产生的误差,当我尝试编译:

/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 
    ^

任何人都可以在这里发现问题吗?

感谢, 约翰

回答

4

内部类无法正常导入,因此适用于Java。只需指定类型投影,因为它为Button#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

谢谢。我觉得这很简单... – jxstanford 2010-12-10 18:42:09

1

一个非常简单的例子,显示这是怎么回事。

爪哇:

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* 

注意,像MenuBar.MenuItem,是一个非静态内部类,因此与一个实例相关联。但是斯卡拉允许我们使用的一个实例导入

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 
} 

如果我们能够import a.Outer.Inner如何将编译器知道哪个的实例是应该属于哪一种?

希望问题已清除。

相关问题