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

让我们看看下一个使用文本框创建输入屏幕的示例。 在下面的示例中,我们要创建一个表单,其中包含学生姓名、学科和学校名称的文本框。 在以下示例中,您可以看到以下关键点 −

  • 我们正在为屏幕上的控件定义布局。 在本例中,我们使用的是网格布局。
  • 我们正在为标签使用对齐属性。
  • 我们使用 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)

上述程序的输出如下所示。 当您单击任一按钮时,所需的消息将发送到控制台日志屏幕。

选项按钮

上述示例的另一个变体是定义可以充当处理程序的方法。 在下面的示例中,我们定义了 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 构建器可用于解析 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 构建器。

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