0

我正在尝试使用 Scala 创建一个带有 MenuBar 的 Vaadin 窗口。我收到一个编译器错误,表明找不到 com.vaadin.ui.MenuBar.MenuItem 导入。我查看了 Vaadin 库(6.4.8),似乎该类在那里:

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

这是 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 { ... }

}

出于演示目的,这是一个示例 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

2 回答 2

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)
  }
}
于 2010-12-10T14:44:31.053 回答
1

一个非常简单的例子,展示了正在发生的事情。

爪哇:

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

斯卡拉:

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

请注意,与MenuBar.MenuItem一样, Inner是一个非静态内部类,因此与Outer的一个实例相关联。但是 Scala 允许我们使用Outer的实例导入Inner

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如何知道Inner应该属于哪个Outer实例?

希望问题已经解决。

于 2010-12-10T11:37:01.227 回答