📜  Groovy-构建器

📅  最后修改于: 2020-11-04 06:50:50             🧑  作者: Mango


在软件开发过程中,有时开发人员会花费大量时间来创建数据结构,域类,XML,GUI布局,输出流等。有时,用于创建这些特定要求的代码会重新创建相同的代码段。代码在很多地方。这就是Groovy构建器发挥作用的地方。 Groovy具有可用于创建标准对象和结构的构建器。这些开发人员可以节省时间,因为开发人员无需编写自己的代码即可创建这些开发人员。在本章中,我们将介绍groovy中可用的不同构建器。

秋千生成器

在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)

上面程序的输出如下:

显示形式

事件处理程序

现在让我们看一下事件处理程序。事件处理程序用于按钮按下按钮时执行某种处理。每个按钮伪方法调用都包含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)

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

选项按钮

上面示例的另一个变体是定义可以充当处理程序的方法。在下面的示例中,我们定义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 = '''
   
    
      
         Joe
         1
      
      
      
         John
         2
      
      
      
         Mark
         3
      
        
   '''
   
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用于创建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”文本。