Scala学习笔记12 - GUI编程

===GUI编程

      scala图形用户界面编程可以使用scala.swing库,该库提供了对java的Swing框架的GUI类的访问,对其进行包装,隐藏了大部分复杂度。示例如下:

      object MyScalaGUI extends SimpleSwingApplication {

         deftop = new MainFrame {

                   title = "My ScalaGUI"

                   location = new Point(600,300)

                   preferredSize = newDimension(400, 200)

                   valbutton = new Button {

                            text = "Click me"

                   }

                   vallabel = new Label {

                            text= "Who am I?"

                   }

                   contents = new BoxPanel(Orientation.Vertical){

                            contents+= button

                            contents+= label

                   }

                   listenTo(button)

                   reactions += {

                            caseButtonClicked(b) => label.text = "Hello, I'm Tom."

                   }

         }

      }

      要编写图形界面程序,你可以继承SimpleSwingApplication类,该类已经定义了包含一些设置java Swing框架代码的main方法,main方法随后会调用top方法,而top方法是抽象的,需要你来实现。top方法应当包含定义顶级GUI组件的代码,这通常是某种Frame

 

GUI类库

      Frame:即可以包含任意数据的窗体。Frame有一些属性(也就是getter和setter),其中比较重要的有title(将被写到标题栏)、contents(将被显示在窗体中)。Frame继承自Container,每个Container都有一个contents属性,让你获得和设置它包含的组件,不过,Framecontents只能包含一个组件,因为框架的contents属性只能通过“=”赋值,而有些Container (Panel)contents可以包含多个组件,因为它们的contents属性可以通过“+=”赋值。

      MainFrame:就像是个普通的Swing的Frame,只不过关闭它的同时也会关闭整个GUI应用程序。

      Panel:面板是根据某种固定的布局规则显示所有它包含的组件的容器。面板可以包含多个组件。

 

处理事件

      为了处理事件,你需要为用户输入事件关联一个动作,scala和java基本上用相同的“发布/订阅”方式来处理事件。发布者又称作事件源,订阅者又称作事件监听器。举例来说,Button是一个事件源,它可以发布一个事件ButtonClicked,表示该按钮被点击。scala中事件是真正的对象,创建一个事件也就是创建一个样本类的实例,样本类的参数指向事件源。事件(样本)类包含在scala.swing.event包中。

      在scala中,订阅一个事件源source的方法是调用listenTo(source),取消订阅的方法是调用deafTo(source)。比如:你可以让一个组件A监听它其中的一个组件B,以便A在B发出任何事件时得到通知。为了让A对监听到的事件做出响应,你需要向A中名为reactions的属性添加一个处理器,处理器也就是带有模式匹配的函数字面量,可以在单个处理器中用多个样本来匹配多种事件。可使用“+=”向reactions中添加处理器,使用“-=”从中移除处理器。从概念上讲,reactions中安装的处理器形成一个栈,当接收到一个事件时,最后被安装的处理器首先被尝试,但不管尝试是否成功,后续的处理器都会被一一尝试。

你可能感兴趣的:(Scala)