Groovy 構(gòu)建器

2022-07-21 11:31 更新

在軟件開發(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)建器。

Swing 構(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。

JLabel的一個文本

讓我們看看下一個用文本框創(chuàng)建輸入屏幕的例子。在以下示例中,我們要創(chuàng)建一個包含學(xué)生姓名,主題和學(xué)校名稱文本框的表單。在以下示例中,您可以看到以下要點 -

  • 我們正在為屏幕上的控件定義一個布局。在這種情況下,我們使用網(wǎng)格布局。
  • 我們正在為我們的標(biāo)簽使用對齊屬性。
  • 我們使用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 : '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生成器

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

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

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

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”的文本。

以上內(nèi)容是否對您有幫助:
在線筆記
App下載
App下載

掃描二維碼

下載編程獅App

公眾號
微信公眾號

編程獅公眾號