在軟件開發(fā)過程中,有時開發(fā)人員花費(fèi)大量時間來創(chuàng)建數(shù)據(jù)結(jié)構(gòu),域類,XML,GUI布局,輸出流等。有時用于創(chuàng)建這些特定需求的代碼導(dǎo)致在許多地方重復(fù)相同的代碼片段。這是Groovy的建設(shè)者發(fā)揮作用。Groovy有可以用來創(chuàng)建標(biāo)準(zhǔn)對象和結(jié)構(gòu)的構(gòu)建器。這些構(gòu)建器節(jié)省了時間,因為開發(fā)人員不需要編寫自己的代碼來創(chuàng)建這些構(gòu)建器。在本章的教程中,我們將看看groovy中可用的不同構(gòu)建器。
在groovy中,還可以使用groovy中提供的swing構(gòu)建器創(chuàng)建圖形用戶界面。開發(fā)swing組件的主要類是SwingBuilder類。這個類有許多方法創(chuàng)建圖形組件,如 -
JFrame - 這是用于創(chuàng)建框架元素。
JTextField - 這用于創(chuàng)建textfield組件。
讓我們看一個簡單的例子,如何使用SwingBuilder類創(chuàng)建一個Swing應(yīng)用程序。在以下示例中,您可以看到以下幾點 -
您需要導(dǎo)入groovy.swing.SwingBuilder和javax.swing.*類。
在Swing應(yīng)用程序中顯示的所有組件都是SwingBuilder類的一部分。
對于框架本身,您可以指定框架的初始位置和大小。您還可以指定框架的標(biāo)題。
您需要將Visibility屬性設(shè)置為true才能顯示框架。
import groovy.swing.SwingBuilder import javax.swing.* // Create a builder def myapp = new SwingBuilder() // Compose the builder def myframe = myapp.frame(title : 'Tutorials Point', 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。
讓我們看看下一個用文本框創(chuàng)建輸入屏幕的例子。在以下示例中,我們要創(chuàng)建一個包含學(xué)生姓名,主題和學(xué)校名稱文本框的表單。在以下示例中,您可以看到以下要點 -
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 : 'Tutorials Point', 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)
以上程序的輸出如下 -
現(xiàn)在讓我們看看事件處理程序。事件處理程序用于按鈕,當(dāng)按下按鈕時執(zhí)行某種處理。每個按鈕偽方法調(diào)用包括actionPerformed參數(shù)。這表示呈現(xiàn)為閉包的代碼塊。
讓我們來看看我們下一個用2個按鈕創(chuàng)建屏幕的例子。當(dāng)按下任一按鈕時,相應(yīng)的消息被發(fā)送到控制臺屏幕。在以下示例中,您可以看到以下要點 -
對于定義的每個按鈕,我們使用actionPerformed方法并定義一個閉包,以便在單擊按鈕時向控制臺發(fā)送一些輸出。
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 : 'Tutorials Point', location : [100, 100], size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE){ mainPanel() } myframe.setVisible(true)
上述程序的輸出如下。單擊任一按鈕時,所需的消息將發(fā)送到控制臺日志屏幕。
上述示例的另一個變體是定義可以充當(dāng)處理程序的方法。在下面的例子中,我們定義了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 : 'Tutorials Point', location : [100, 100], size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) { mainPanel() } myframe.setVisible(true)
上述程序的輸出將保持與前面的示例相同。
DOM構(gòu)建器可用于解析HTML,XHTML和XML,并將其轉(zhuǎn)換為W3C DOM樹。
以下示例顯示如何使用DOM構(gòu)建器。
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用于創(chuàng)建json類型的對象。
以下示例顯示如何使用Json構(gòu)建器。
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能夠從結(jié)構(gòu)化的節(jié)點集合構(gòu)建json對象。
{"students":{"student":{"studentname":"Joe","studentid":"1","Marks":{"Subject1":10, "S ubject2":20,"Subject3":30}}}}
jsonbuilder還可以接受一個列表并將其轉(zhuǎn)換為json對象。以下示例說明如何完成此操作。
def builder = new groovy.json.JsonBuilder() def lst = builder([1, 2, 3]) println(builder.toString());
上述程序的輸出如下。
[1,2,3]
jsonBuilder也可以用于類。以下示例顯示類的對象如何成為json構(gòu)建器的輸入。
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用于創(chuàng)建Node對象的嵌套樹以處理任意數(shù)據(jù)。下面顯示了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是一個從規(guī)范生成文件目錄結(jié)構(gòu)的構(gòu)建器。以下是如何使用FileTreeBuilder的示例。
tmpDir = File.createTempDir() def fileTreeBuilder = new FileTreeBuilder(tmpDir) fileTreeBuilder.dir('main') { dir('submain') { dir('Tutorial') { file('Sample.txt', 'println "Hello World"') } } }
從上述代碼的執(zhí)行,將在文件夾main / submain / Tutorial中創(chuàng)建一個名為sample.txt的文件。而sample.txt文件將具有“Hello World”的文本。
更多建議: