Groovy - Строители

В процессе разработки программного обеспечения разработчики иногда тратят много времени на создание структур данных, классов предметной области, XML, макетов графического интерфейса пользователя, потоков вывода и т. Д., А иногда код, используемый для создания этих конкретных требований, приводит к повторению одного и того же фрагмента код во многих местах. Здесь в игру вступают Groovy-конструкторы. В Groovy есть построители, которые можно использовать для создания стандартных объектов и структур. Эти конструкторы экономят время, поскольку разработчику не нужно писать собственный код для создания этих построителей. В рамках этой главы мы рассмотрим различные конструкторы, доступные в Groovy.

Строитель качелей

В Groovy также можно создавать графические пользовательские интерфейсы с помощью построителей качелей, доступных в Groovy. Основной класс для разработки компонентов SwingBuilder - это класс SwingBuilder. Этот класс имеет много методов для создания графических компонентов, таких как -

  • JFrame - Это для создания каркасного элемента.

  • JTextField - Используется для создания компонента текстового поля.

Давайте посмотрим на простой пример того, как создать приложение Swing с помощью класса SwingBuilder. В следующем примере вы можете увидеть следующие моменты -

  • Вам необходимо импортировать классы 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 вместе с JLabel с текстом Hello World.

Давайте посмотрим на наш следующий пример создания экрана ввода с текстовыми полями. В следующем примере мы хотим создать форму, которая имеет текстовые поля для имени ученика, предмета и названия школы. В следующем примере вы можете увидеть следующие ключевые моменты -

  • Мы определяем макет для наших элементов управления на экране. В этом случае мы используем макет сетки.
  • Мы используем свойство выравнивания для наших меток.
  • Мы используем метод 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. Это представляет собой блок кода, представленный как закрытие.

Давайте посмотрим на наш следующий пример создания экрана с двумя кнопками. При нажатии любой кнопки на экран консоли отправляется соответствующее сообщение. В следующем примере вы можете увидеть следующие ключевые моменты -

  • Для каждой определенной кнопки мы используем метод 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 = '''
   <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

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».