Groovy - 構建器



在軟體開發過程中,有時開發人員會花費大量時間建立資料結構、領域類、XML、GUI 佈局、輸出流等。有時用於建立這些特定需求的程式碼會導致在許多地方重複相同的程式碼片段。這就是 Groovy 構建器發揮作用的地方。Groovy 具有可用於建立標準物件和結構的構建器。這些構建器節省了時間,因為開發人員無需編寫自己的程式碼來建立這些構建器。在本節中,我們將瞭解 Groovy 中可用的不同構建器。

Swing 構建器

在 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 : '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 With a Text

讓我們看下一個建立帶有文字框的輸入螢幕的示例。在以下示例中,我們希望建立一個包含學生姓名、科目和學校名稱文字框的表單。在以下示例中,您可以看到以下關鍵點:

  • 我們正在為螢幕上的控制元件定義佈局。在這種情況下,我們使用的是網格佈局。
  • 我們正在為標籤使用對齊屬性。
  • 我們正在使用 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)

上面程式的輸出如下所示:

Display Form

事件處理程式

現在讓我們看一下事件處理程式。事件處理程式用於按鈕在按下按鈕時執行某種處理。每個按鈕偽方法呼叫都包含 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 : 'Tutorials Point', location : [100, 100],
   size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE){
      mainPanel()
   }
	
myframe.setVisible(true)

上面程式的輸出如下所示。當您單擊任一按鈕時,所需的訊息將傳送到控制檯日誌螢幕。

Option Button

上面示例的另一種變體是定義可以充當處理程式的方法。在以下示例中,我們正在定義 2 個 DisplayA 和 DisplayB 處理程式。

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 構建器可用於解析 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());

上面程式的輸出如下所示。輸出清楚地表明 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 用於建立用於處理任意資料的 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”文字。

廣告

© . All rights reserved.