建设者(Builders)
在软件开发过程中,有时开发人员会花费大量时间来创建数据结构,域类,XML,GUI布局,输出流等。有时,用于创建这些特定需求的代码会导致重新生成相同的片段。很多地方的代码。 这就是Groovy构建者发挥作用的地方。 Groovy具有可用于创建标准对象和结构的构建器。 这些构建器节省了时间,因为开发人员不需要编写自己的代码来创建这些构建器。 在本章的内容中,我们将介绍groovy中可用的不同构建器。
Swing Builder
在groovy中,还可以使用groovy中提供的swing构建器创建图形用户界面。 开发swing组件的主要类是SwingBuilder类。 这个类有很多方法可用于创建图形组件,例如 -
JFrame - 用于创建框架元素。
JTextField - 用于创建文本域组件。
让我们看一个如何使用SwingBuilder类创建Swing应用程序的简单示例。 在以下示例中,您可以看到以下几点 -
您需要导入groovy.swing.SwingBuilder和javax.swing。*类。
Swing应用程序中显示的所有组件都是SwingBuilder类的一部分。
对于框架本身,您可以指定框架的初始位置和大小。 您还可以指定框架的标题。
您需要将Visibility属性设置为true才能显示框架。
import groovy.swing.SwingBuilder
import javax.swing.*
// Create a builder
def myapp = new SwingBuilder()
// Compose the builder
def myframe = myapp.frame(title : 'IOWIKI', location : [200, 200],
size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE {
label(text : 'Hello world')
}
// The following statement is used for displaying the form
frame.setVisible(true)
上述程序的输出如下。 以下输出显示JFrame以及带有Hello World文本的JLabel。
让我们看看下一个用文本框创建输入屏幕的示例。 在下面的示例中,我们要创建一个表单,其中包含学生姓名,主题和学校名称的文本框。 在以下示例中,您可以看到以下要点 -
- 我们正在为屏幕上的控件定义布局。 在这种情况下,我们使用网格布局。
- 我们正在为标签使用对齐属性。
- 我们使用textField方法在屏幕上显示文本框。
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*
// Create a builder
def myapp = new SwingBuilder()
// Compose the builder
def myframe = myapp.frame(title : 'IOWIKI', location : [200, 200],
size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) {
panel(layout: new GridLayout(3, 2, 5, 5)) {
label(text : 'Student Name:', horizontalAlignment : JLabel.RIGHT)
textField(text : '', columns : 10)
label(text : 'Subject Name:', horizontalAlignment : JLabel.RIGHT)
textField(text : '', columns : 10)
label(text : 'School Name:', horizontalAlignment : JLabel.RIGHT)
textField(text : '', columns : 10)
}
}
// The following statement is used for displaying the form
myframe.setVisible(true)
上述计划的输出如下 -
事件处理程序
现在让我们看一下事件处理程序。 当按下按钮时,事件处理程序用于按钮执行某种处理。 每个按钮伪方法调用包括actionPerformed参数。 这表示作为闭包呈现的代码块。
让我们看看下一个用2个按钮创建屏幕的例子。 按下任一按钮时,相应的消息将发送到控制台屏幕。 在以下示例中,您可以看到以下要点 -
对于定义的每个按钮,我们使用actionPerformed方法并定义一个闭包,以便在单击按钮时将一些输出发送到控制台。
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*
def myapp = new SwingBuilder()
def buttonPanel = {
myapp.panel(constraints : BorderLayout.SOUTH) {
button(text : 'Option A', actionPerformed : {
println 'Option A chosen'
})
button(text : 'Option B', actionPerformed : {
println 'Option B chosen'
})
}
}
def mainPanel = {
myapp.panel(layout : new BorderLayout()) {
label(text : 'Which Option do you want', horizontalAlignment :
JLabel.CENTER,
constraints : BorderLayout.CENTER)
buttonPanel()
}
}
def myframe = myapp.frame(title : 'IOWIKI', location : [100, 100],
size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE){
mainPanel()
}
myframe.setVisible(true)
上述程序的输出如下。 单击任一按钮时,所需的消息将发送到控制台日志屏幕。
上述示例的另一个变体是定义可以充当处理程序的方法。 在下面的示例中,我们定义了DisplayA和DisplayB的2个处理程序。
import groovy.swing.SwingBuilder
import javax.swing.*
import java.awt.*
def myapp = new SwingBuilder()
def DisplayA = {
println("Option A")
}
def DisplayB = {
println("Option B")
}
def buttonPanel = {
myapp.panel(constraints : BorderLayout.SOUTH) {
button(text : 'Option A', actionPerformed : DisplayA)
button(text : 'Option B', actionPerformed : DisplayB)
}
}
def mainPanel = {
myapp.panel(layout : new BorderLayout()) {
label(text : 'Which Option do you want', horizontalAlignment : JLabel.CENTER,
constraints : BorderLayout.CENTER)
buttonPanel()
}
}
def myframe = myapp.frame(title : 'IOWIKI', location : [100, 100],
size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) {
mainPanel()
}
myframe.setVisible(true)
上述程序的输出将与前面的示例保持一致。
DOM Builder
DOM构建器可用于解析HTML,XHTML和XML并将其转换为W3C DOM树。
以下示例显示了如何使用DOM构建器。
String records = '''
<library>
<Student>
<StudentName division = 'A'>Joe</StudentName>
<StudentID>1</StudentID>
</Student>
<Student>
<StudentName division = 'B'>John</StudentName>
<StudentID>2</StudentID>
</Student>
<Student>
<StudentName division = 'C'>Mark</StudentName>
<StudentID>3</StudentID>
</Student>
</library>'''
def rd = new StringReader(records)
def doc = groovy.xml.DOMBuilder.parse(rd)
JsonBuilder
JsonBuilder用于创建json类型对象。
以下示例显示了如何使用Json构建器。
def builder = new groovy.json.JsonBuilder()
def root = builder.students {
student {
studentname 'Joe'
studentid '1'
Marks(
Subject1: 10,
Subject2: 20,
Subject3:30,
)
}
}
println(builder.toString());
上述程序的输出如下。 输出clearlt显示Jsonbuilder能够从一组结构节点构建json对象。
{"students":{"student":{"studentname":"Joe","studentid":"1","Marks":{"Subject1":10,
"S ubject2":20,"Subject3":30}}}}
jsonbuilder还可以接受列表并将其转换为json对象。 以下示例说明了如何实现此目的。
def builder = new groovy.json.JsonBuilder()
def lst = builder([1, 2, 3])
println(builder.toString());
上述程序的输出如下。
[1,2,3]
jsonBuilder也可以用于类。 以下示例显示了类的对象如何成为json构建器的输入。
def builder = new groovy.json.JsonBuilder()
class Student {
String name
}
def studentlist = [new Student (name: "Joe"), new Student (name: "Mark"),
new Student (name: "John")]
builder studentlist, { Student student ->name student.name}
println(builder)
上述程序的输出如下。
[{"name":"Joe"},{"name":"Mark"},{"name":"John"}]
NodeBuilder (NodeBuilder)
NodeBuilder用于创建Node对象的嵌套树,以处理任意数据。 Nodebuilder的使用示例如下所示。
def nodeBuilder = new NodeBuilder()
def studentlist = nodeBuilder.userlist {
user(id: '1', studentname: 'John', Subject: 'Chemistry')
user(id: '2', studentname: 'Joe', Subject: 'Maths')
user(id: '3', studentname: 'Mark', Subject: 'Physics')
}
println(studentlist)
FileTreeBuilder
FileTreeBuilder是一个用于从规范生成文件目录结构的构建器。 以下是如何使用FileTreeBuilder的示例。
tmpDir = File.createTempDir()
def fileTreeBuilder = new FileTreeBuilder(tmpDir)
fileTreeBuilder.dir('main') {
dir('submain') {
dir('Tutorial') {
file('Sample.txt', 'println "Hello World"')
}
}
}
从执行上面的代码开始,将在main/submain/Tutorial文件夹中创建一个名为sample.txt的文件。 sample.txt文件将包含“Hello World”文本。