Groovy documentation can be found here Note, however, the documentation does not include much on building a GUI using SwingBuilder
Copy the code below and paste it into the System console, choose Groovy and then evaluate. It may take a few seconds for the GUI to appear. Closing the GUI window will close jAlbum too.
/*
* Licensed to the Apache Software Foundation (ASF) under one
* or more contributor license agreements. See the NOTICE file
* distributed with this work for additional information
* regarding copyright ownership. The ASF licenses this file
* to you under the Apache License, Version 2.0 (the
* "License"); you may not use this file except in compliance
* with the License. You may obtain a copy of the License at
*
* http://www.apache.org/licenses/LICENSE-2.0
*
* Unless required by applicable law or agreed to in writing,
* software distributed under the License is distributed on an
* "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
* KIND, either express or implied. See the License for the
* specific language governing permissions and limitations
* under the License.
*/
import java.awt.Color
import javax.swing.SwingConstants
import javax.swing.WindowConstants
import groovy.swing.SwingBuilder
def swing = new SwingBuilder()
def unownedDialog
def ownedDialog
def showUnownedDialog(event) {
unownedDialog.show();
}
def showOwnedDialog(event) {
ownedDialog.show();
}
unownedDialog = swing.dialog(
title:'unrooted dialog',
location: [200, 200],
pack:true,
defaultCloseOperation:WindowConstants.DISPOSE_ON_CLOSE
) {
label("I am unowned, but not unwanted");
}
def frame = swing.frame(
title:'FrameTitle',
location:[100,100],
size:[800,400],
defaultCloseOperation:WindowConstants.EXIT_ON_CLOSE) {
menuBar {
menu(text:'File') {
menuItem() {
action(name:'New', closure:{ println("clicked on the new menu item!") })
}
menuItem() {
action(name:'Open', closure:{ println("clicked on the open menu item!") })
}
separator()
menuItem() {
action(name:'Save', enabled:false, closure:{ println("clicked on the Save menu item!") })
}
}
menu(text:'Dialogs') {
menuItem() {
action(name:'Owned Dialog', closure: this.&showOwnedDialog)
}
menuItem() {
action(name:'Unowned Dialog', closure: this.&showUnownedDialog)
}
def deeplyOwnedDialog = swing.dialog(
title:'rooted dialog #2',
location: [200, 200],
pack:true,
defaultCloseOperation:WindowConstants.DISPOSE_ON_CLOSE
) {
label("ownership is deep");
}
menuItem() {
action(name:'Deeply Owned Dialog', closure: {deeplyOwnedDialog.show()} )
}
}
}
tabbedPane() {
//colorChooser(
// name:"Color Chooser",
// color: 0xfeed42)
panel(name:"Formatted Text Fields") {
gridLayout(columns: 2, rows: 0)
label("Simple Constructor:")
formattedTextField()
label("Date Value")
formattedTextField(value: new java.util.Date())
label("Integer Value")
formattedTextField(value: new java.lang.Integer(42))
label("Date Format")
formattedTextField(format: java.text.DateFormat.getDateInstance())
label("Currency Format ")
formattedTextField(format: new java.text.DecimalFormat("¤###.00;(¤###.00)"))
}
panel(name:"Sliders") {
flowLayout()
slider(minimum:-100,
maximum:100,
majorTickSpacing: 50,
orientation: SwingConstants.VERTICAL,
paintLabels:true)
slider(minimum:-100,
maximum:100,
orientation: SwingConstants.VERTICAL,
paintLabels:true,
paintTicks:true,
majorTickSpacing: 50,
minorTickSpacing: 10,
snapToTicks:true,
paintTrack:true)
}
panel(name:"Spinners") {
gridBagLayout()
label(
text:"Tempuature in London:",
insets:[12, 12, 2, 2],
anchor: EAST,
gridx: 0)
spinner(
model:spinnerNumberModel(minimum:-10,
maximum: 40,
value:20,
stepSize:5),
insets:[12, 3, 2, 12],
anchor: WEST,
gridx: 1,
fill: HORIZONTAL)
label(
text:"Baseball Leagues:",
insets:[3, 12, 2, 2],
anchor: EAST,
gridx: 0)
spinner(
model:spinnerListModel(
list: ["Major League", "AAA", "AA", "A", "Rookie", "Semi-Pro", "Rec A", "Rec B"],
value: "AA"),
insets:[3, 3, 2, 12],
anchor: WEST,
gridx: 1,
fill: HORIZONTAL)
label(
text:"Today's Date:",
insets:[3, 12, 2, 2],
anchor: EAST,
gridx: 0)
spinner(
model:spinnerDateModel(calendarField: Calendar.HOUR_OF_DAY),
insets:[3, 3, 2, 12],
anchor: WEST,
gridx: 1,
fill: HORIZONTAL)
}
panel(name:"Border Layout") {
borderLayout()
label(text:"Border Layout",
constraints:NORTH,
horizontalAlignment:SwingConstants.CENTER)
label(text:"South",
constraints:SOUTH,
background:Color.YELLOW,
opaque:true,
horizontalAlignment:SwingConstants.CENTER,
toolTipText:"Tooltip on south")
label(text:"West",
constraints:WEST,
background:Color.ORANGE,
opaque:true,
horizontalAlignment:SwingConstants.CENTER,
toolTipText:"Tooltip on west")
label(text:"East",
constraints:EAST,
background:Color.GREEN,
opaque:true,
horizontalAlignment:SwingConstants.CENTER,
toolTipText:"Tooltip on east")
label(text:"Center",
constraints:CENTER,
background:Color.WHITE,
opaque:true,
horizontalAlignment:SwingConstants.CENTER,
toolTipText:"<html>This is not the tooltip you are looking for.<br><i>*waves hand*</i>")
}
}
ownedDialog = swing.dialog(
title:'rooted dialog',
location: [200, 200],
pack:true,
defaultCloseOperation:WindowConstants.DISPOSE_ON_CLOSE
) {
label("j00 h4v3 b33n 0wn3xed");
}
}
frame.show()
Below is some code examples, found on the internet, to help you get started. From sourceforge.net/p/freeplane
import groovy.swing.SwingBuilder
import java.awt.FlowLayout as FL
import javax.swing.BoxLayout as BXL
import javax.swing.JFrame
//def dial diallocationRelativeTo:ui.frame and owner:ui.frame fails as ui. is not rcognised, need to ref jAlbum window, or just remove them?
def s = new SwingBuilder()
s.setVariable('myDialog-properties',[:])
def vars = s.variables
def dial = s.dialog(title:'Dialog 1', id:'myDialog', modal:true, locationRelativeTo:ui.frame, owner:ui.frame, defaultCloseOperation:JFrame.DISPOSE_ON_CLOSE, pack:true, show:true) {
panel() {
boxLayout(axis:BXL.Y_AXIS)
panel(alignmentX:0f) {
flowLayout(alignment:FL.LEFT)
checkBox(id:'check', text:'Checkbox') // append 'selected: true' to have the checkbox already selected
}
panel(alignmentX:0f) {
flowLayout(alignment:FL.LEFT)
label('Text')
textArea(id:'textArea', columns:10, rows:2)
}
panel(alignmentX:0f) {
flowLayout(alignment:FL.LEFT)
label('Completion:')
buttonGroup().with { group ->
radioButton(id: '0', text: '0%', selected: true, buttonGroup: group)
radioButton(id: '25', text: '25%', buttonGroup: group)
radioButton(id: '50', text: '50%', buttonGroup: group)
radioButton(id: '75', text: '75%', buttonGroup: group)
radioButton(id: '100', text: '100%', buttonGroup: group)
}
}
panel(alignmentX:0f) {
flowLayout(alignment:FL.LEFT)
label('Combo')
comboBox(id:'combo', items:['Option 1', 'Option 2'])
}
panel(alignmentX:0f) {
flowLayout(alignment:FL.LEFT)
button('Submit', preferredSize:[80, 24],
actionPerformed:{
vars.dialogResult = 'ok'
dispose()
})
button('Cancel', preferredSize:[80, 24],
actionPerformed:{
vars.dialogResult = 'cancel'
dispose()
})
}
}
}
if (vars.dialogResult == 'ok') {
def child = node.createChild(vars.textArea.text)
def percent = ["0", "25", "50", "75", "100"].find{ vars[it].selected }
child.icons.add(percent + "%")
child["combo"] = vars.combo.selectedItem
child["checkbox"] = (vars.check.selected ? 'checked' : 'not checked')
}
From josh-in-antarctica.blogspot.com A nicer way to do it using Groovy's with keyword: from
buttonGroup().with {
add radioButton(text: 'Option 1')
add radioButton(text: 'Option 2')
}
Spinners take the form of
spinner (id:'spinnerName', model:spinnerNumberModel(minimum:0, maximum: 40, value:20, stepSize:5)) spinner(id:'spinnerName', model:spinnerListModel( list: ["Text one", "two", "three", "four", "five"], value: "three") spinner(id:'spinnerName', model:spinnerDateModel(calendarField: Calendar.HOUR_OF_DAY)
There is a Groovy discussion forum at nabble.com with question and answers which may have useful tips. For example: nabble.com groovy-examples