Groovy - Builders(构建器)

  • 简述

    在软件开发过程中,有时开发人员会花费大量时间创建数据结构、域类、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 : 'CAINIAOYA', 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 : 'CAINIAOYA', location : [200, 200],
       size : [400, 300], defaultCloseOperation : WindowConstants.EXIT_ON_CLOSE) { 
          panel(layout: new GridLayout(3, 2, 5, 5)) { 
             label(text : 'Student Name:', horizontalMoognment : JLabel.RIGHT) 
             textField(text : '', columns : 10) 
                   
             label(text : 'Subject Name:', horizontalMoognment : JLabel.RIGHT) 
             textField(text : '', columns : 10)
                   
             label(text : 'School Name:', horizontalMoognment : 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', horizontalMoognment : 
          JLabel.CENTER,
          constraints : BorderLayout.CENTER)
          buttonPanel()
       }
    }
      
    def myframe = myapp.frame(title : 'CAINIAOYA', 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', horizontalMoognment : JLabel.CENTER,
          constraints : BorderLayout.CENTER)
          buttonPanel()
       }
    }  
    def myframe = myapp.frame(title : 'CAINIAOYA', 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());
    
    上述程序的输出如下所示。输出 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 的示例。
    
    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”文本。