1 GUI编程
1.1 前言
Scala开发图形用户界面(GUI)的应用程序基于一个Scala库,该类库提供对Java的Swing框架的GUI类访问。该类库和它的下层的Swing类很像,隐藏了大部分的复杂度,使Scala开发图形用户界面开发变得容易。
1.2 第一个Swing程序
使用Swing编程,你需要从Scala的SwingAPI导入类。import scala.swing._
// 导入scala.swing下所有的包
import scala.swing._
// 实现SimpleSwingApplication抽象类 // 重写top方法,返回Frame类型
object HelloGUI extends SimpleSwingApplication {
// MainFrame是一个容器
def top = new MainFrame {
// title、content空器的属性
title = "First Swing App"
contents = new Button {
text = "Click me"
}
}
}
执行结果:
1.3 面板与布局
在Java的GUI,容器是很重要图形界面开发的一种思想,同样在Scala中也提供了容器的概念。面板:用于容纳将构建的按钮、标签等组件。布局:使用Panel类的各种子类实现各种不同的布局。
import scala.swing.SimpleSwingApplication
import scala.swing.MainFrame
import scala.swing.Button
import scala.swing.Label
import scala.swing.BoxPanel
import scala.swing.Orientable
import scala.swing.Orientation
import scala.swing.Swing
object GuiPanelLayout extends SimpleSwingApplication {
def top = new MainFrame {
// 窗口标题
title = "Second GUI";
// 构建按钮组件
val button = new Button {
// 设置按钮上的文字
text = "Scala"
}
// 构建标签
val label = new Label {
// 设置标签上的文字
text = "Here is Spark!!!";
}
// 构建面页面,并将面板设置到窗口,BoxPanel=>Orientation.Vertical,垂直布局
contents = new BoxPanel(Orientation.Vertical) {
// 将按钮和标签添加到容中
contents += button;
contents += label;
// 设置边框,上下左右都是50
border = Swing.EmptyBorder(50, 50, 50, 50);
}
}
}
执行结果:
1.4 事件处理
在Swing的事件模型中,组件可以发起(触发)一个事件。Java和Scala基本上用相同的“发布/订阅”方式处理事件:组件可以为发布者,也可以为订阅者。发布者发面事件,订阅者向发布者订阅从而在任何发布的事件发生时得到通知。发布者又称:“事件源”,访阅者又称作:“事件监听器”。如:Button是一个事件源,发布一个事件ButtonClicked事件,表示该按钮被点击。
import java.io.File;
import scala.swing.event.ButtonClicked;
import scala.swing.event.ActionEvent;
import scala.swing.SimpleSwingApplication;
import scala.swing.FileChooser;
import scala.swing.Button;
import scala.swing.Label;
import scala.swing.FlowPanel;
import scala.swing.MainFrame;
object GUIEvent extends SimpleSwingApplication {
// 文件选择器
var fileChooser = new FileChooser(new File("."));
// 设置选择器的标题
fileChooser.title = "fileChooser"
// 定义按钮
val button = new Button {
// 设置按钮的文字
text = "Choose a File from local";
}
// 设置标签,设置标签文本内容
val lable = new Label {
text = "No any file selected yet"
}
// 创建一个FlowPanel面板容器
val mainPanel = new FlowPanel {
// 将创建 的按钮和标签组件,添加到FlowPanel容器中
contents += button;
contents += lable;
}
def top = new MainFrame {
// 设置窗口标题
title = "Scala Gui Programing advanced!!!";
// 将面板添加到窗体上
contents = mainPanel;
// 监听button
listenTo(button);
// 事件处理
reactions += {
// 匹配按钮点击事件
case ButtonClicked(e) => {
// 弹出打开选择文件弹出框
val result = fileChooser.showOpenDialog(mainPanel);
// 判断选择是文件
if (result == FileChooser.Result.Approve) {
// 改变lable文本为:选择文件的路径
lable.text = fileChooser.selectedFile.getPath;
}
}
}
}
}
执行结果:
执行结果:点击按钮事件
——厚积薄发(yuanxw)