Groovy - Builders
Podczas procesu tworzenia oprogramowania czasami programiści spędzają dużo czasu na tworzeniu struktur danych, klas domen, XML, układów GUI, strumieni wyjściowych itp., A czasami kod użyty do stworzenia tych konkretnych wymagań powoduje powtórzenie tego samego fragmentu kodu kod w wielu miejscach. Tutaj do gry wchodzą konstruktorzy Groovy. Groovy ma konstruktory, których można używać do tworzenia standardowych obiektów i struktur. Te konstruktory oszczędzają czas, ponieważ programiści nie muszą pisać własnego kodu, aby utworzyć te konstruktory. W związku z tym rozdziałem przyjrzymy się różnym konstruktorom dostępnym w grze groovy.
Swing Builder
W Groovy można również tworzyć graficzne interfejsy użytkownika za pomocą konstruktorów huśtawek dostępnych w Groovy. Główną klasą do tworzenia komponentów swing jest klasa SwingBuilder. Ta klasa ma wiele metod tworzenia komponentów graficznych, takich jak -
JFrame - Służy do tworzenia elementu ramy.
JTextField - Służy do tworzenia komponentu Textfield.
Przyjrzyjmy się prostemu przykładowi tworzenia aplikacji Swing przy użyciu klasy SwingBuilder. W poniższym przykładzie można zobaczyć następujące punkty -
Musisz zaimportować klasy groovy.swing.SwingBuilder i javax.swing. *.
Wszystkie komponenty wyświetlane w aplikacji Swing są częścią klasy SwingBuilder.
W przypadku samej ramki można określić początkowe położenie i rozmiar ramki. Możesz także określić tytuł ramki.
Musisz ustawić właściwość Visibility na true, aby ramka była wyświetlana.
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)
Wynik powyższego programu podano poniżej. Poniższe dane wyjściowe pokazują JFrame wraz z JLabel z tekstem Hello World.
Spójrzmy na nasz następny przykład tworzenia ekranu wprowadzania z polami tekstowymi. W poniższym przykładzie chcemy utworzyć formularz zawierający pola tekstowe dla nazwiska ucznia, przedmiotu i nazwy szkoły. W poniższym przykładzie można zobaczyć następujące kluczowe punkty -
- Definiujemy układ naszych elementów sterujących na ekranie. W tym przypadku używamy układu siatki.
- Używamy właściwości wyrównania dla naszych etykiet.
- Używamy metody textField do wyświetlania pól tekstowych na ekranie.
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)
Wynik powyższego programu podano poniżej -
Obsługa zdarzeń
Spójrzmy teraz na programy obsługi zdarzeń. Procedury obsługi zdarzeń są używane dla przycisku do wykonywania pewnego rodzaju przetwarzania po naciśnięciu przycisku. Każde wywołanie pseudometody przycisku zawiera parametr actionPerformed. To reprezentuje blok kodu przedstawiony jako zamknięcie.
Spójrzmy na nasz następny przykład tworzenia ekranu z 2 przyciskami. Po naciśnięciu dowolnego przycisku na ekranie konsoli wysyłany jest odpowiedni komunikat. W poniższym przykładzie można zobaczyć następujące kluczowe punkty -
Dla każdego zdefiniowanego przycisku używamy metody actionPerformed i definiujemy zamknięcie, które wysyła pewne dane wyjściowe do konsoli po kliknięciu przycisku.
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)
Wynik powyższego programu podano poniżej. Kliknięcie dowolnego przycisku powoduje wysłanie wymaganej wiadomości do ekranu dziennika konsoli.
Inną odmianą powyższego przykładu jest zdefiniowanie metod, które mogą działać jako programy obsługi. W poniższym przykładzie definiujemy 2 programy obsługi DisplayA i 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)
Wynik powyższego programu pozostałby taki sam, jak w poprzednim przykładzie.
DOM Builder
Kreator DOM może być używany do parsowania HTML, XHTML i XML i konwertowania ich na drzewo W3C DOM.
Poniższy przykład pokazuje, jak można użyć konstruktora 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 służy do tworzenia obiektów typu JSON.
Poniższy przykład pokazuje, jak można użyć konstruktora 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());
Wynik powyższego programu podano poniżej. Dane wyjściowe clearlt pokazują, że Jsonbuilder był w stanie skompilować obiekt json z zestawu węzłów o określonej strukturze.
{"students":{"student":{"studentname":"Joe","studentid":"1","Marks":{"Subject1":10,
"S ubject2":20,"Subject3":30}}}}
Jsonbuilder może również pobrać listę i przekonwertować ją na obiekt json. Poniższy przykład pokazuje, jak można to osiągnąć.
def builder = new groovy.json.JsonBuilder()
def lst = builder([1, 2, 3])
println(builder.toString());
Wynik powyższego programu podano poniżej.
[1,2,3]
JsonBuilder może być również używany dla klas. Poniższy przykład pokazuje, jak obiekty klasy mogą stać się danymi wejściowymi dla konstruktora 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)
Wynik powyższego programu podano poniżej.
[{"name":"Joe"},{"name":"Mark"},{"name":"John"}]
NodeBuilder
NodeBuilder służy do tworzenia zagnieżdżonych drzew obiektów Node do obsługi dowolnych danych. Przykład użycia Nodebuildera pokazano poniżej.
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 to program do tworzenia struktury katalogów plików na podstawie specyfikacji. Poniżej znajduje się przykład, w jaki sposób można użyć FileTreeBuilder.
tmpDir = File.createTempDir()
def fileTreeBuilder = new FileTreeBuilder(tmpDir)
fileTreeBuilder.dir('main') {
dir('submain') {
dir('Tutorial') {
file('Sample.txt', 'println "Hello World"')
}
}
}
Po wykonaniu powyższego kodu w folderze main / submain / Tutorial zostanie utworzony plik o nazwie sample.txt. Plik sample.txt będzie zawierał tekst „Hello World”.