2013-06-30 4 views
2

Я начинаю изучать Скала, и я смущен. Могу ли я создать графический интерфейс без «расширения SimpleSwingApplication» или «SimpleGUIApplication» или может быть что-то еще? Я пытаюсь сделать это так:Могу ли я создать графический интерфейс без «расширений»

import scala.swing._ 

object Main { 
def main(args:Array[String]): Unit = { 
    val frame = new Frame {title = "test GUI"} 
    val button = new Button {text = "test button"} 
    val uslPanel = new BoxPanel(Orientation.Vertical) { 
     contents += button 
     } 
    //listenTo(button) 

    frame.contents_=(uslPanel) 
    frame.visible_=(true) 
    } 
} 

Он работает, но если только «listenTo (Боттон)» комментируется. Как я могу использовать «listenTo (...)» без «extends SimpleGui ... и т. Д.».

ответ

2

Две вещи, которые придают черты качания. (1) они переносят исходный код на поток отправки событий (см. Swing's Threading Policy, также here). (2) Они наследуют черту Reactor, которая дает вам метод listenTo, который теперь отсутствует.

Я думаю, вы должны просто смешать в приложении черту SwingApplication, это самый простой. В противном случае, вы можете сделать эти вещи вручную:

import scala.swing._ 

object Main { 
    def main(args: Array[String]) { 
    Swing.onEDT(initGUI) // Scala equivalent of Java's SwingUtilities.invokeLater 
    } 

    def initGUI() { 
    val frame = new Frame { title = "test GUI" } 
    val button = new Button { text = "test button" } 
    val uslPanel = new BoxPanel(Orientation.Vertical) { 
     contents += button 
    } 
    val r = new Reactor {} 
    r.listenTo(button) 
    r.reactions += { 
     case event.ButtonClicked(_) => println("Clicked") 
    } 

    frame.contents = uslPanel 
    frame.visible = true // or use `frame.open()` 
    } 
} 

Обратите внимание, что каждый виджет в Scala-Swing, унаследованный Reactor, поэтому часто этот стиль:

val button = new Button { 
     text = "test button" 
     listenTo(this) // `listenTo` is defined on Button because Button is a Reactor 
     reactions += { // `reactions` as well 
     case event.ButtonClicked(_) => println("Clicked") 
     } 
    } 
+0

да, это работает, спасибо очень много. – Bersano

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