2010-12-10 3 views
0

Я пытаюсь создать окно Vaadin с помощью MenuBar с помощью Scala. Я получаю ошибку компилятора, которая указывает, что импорт 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 

Вот класс структуры от источника 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

Внутренние классы нельзя импортировать, как обычно, для Java. Просто укажите типы прогнозов, как это делается для Button # ClickEvent type:

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

Очень простой пример, показывающий, что происходит.

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* 

Обратите внимание, что Внутренняя, как MenuBar.MenuItem, не является статическим внутренним классом, и как таковой связан с одним экземпляром от Наружный. Но Scala позволяет импортировать 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 как бы компилятор знать, какой экземпляр Outer является Внутренний должен принадлежать?

Надеюсь, что проблема была устранена.

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