Griffon
Swing just got fun againJames Williams
Agenda
> What's un-fun about Swing?
> What is Griffon?
> Getting Started
> Builders
> Griffon MVC
> Lifecycle
> Plugins/Addons
> Demos
> Q&A
What's un-fun about Swing?
> not knowing where stuff is
> can be very repetitive
> unresponsive user interfaces
> configuring webstart apps is a nightmare
> you're forced to choose between applets and desktop
fairly early
What is Griffon?
> desktop framework leveraging Swing and Groovy
> Apache 2 Licensed
> very extensible with plugins and addons
> allows you to code without worrying about the destination
platform
Griffon Application Structure
Getting Started
> griffon create-app
> griffon run-app
> griffon run-applet
> griffon run-webstart
> griffon package
> griffon list-plugins
> griffon install-plugin
Builders
> DSLs to compose complex object graphs
> Can automatically perform some common conversions
> Yield much more readable code than Java
Would you prefer this ...
public class JavaFrame extends JFrame { public JavaFrame() { setLayout(new GridLayout(3,1)); setTitle("Test"); setSize(100,100); add(new JLabel("One")); add(new JLabel("Two")); add(new JLabel("Three")); }
public static void main(String [ ] args) { new JavaFrame().setVisible(true); }}
... or this?
def swing = new SwingBuilder()
swing.frame(size:[100,100], title:'Test', layout:new GridLayout(3,1)){ label("One") label("Two") label("Three")}.show()
30 sec Swing(X)Builder Quick Guide
> Take the class name (e.g. JFrame)
> Remove the J(X)
> Change the remaining node name to camel-case
> Any fields that follow the JavaBean spec can be passed in
a HashMap
UberBuilder - Builders on steriods
> Allows you to mix and match components
> Avoids collisions by setting up namespaces
UberBuilder - Supported toolkits
> Swing
> SwingX
> JIDE
> Flamingo
> MacWidgets
> SwingXtras
> Fx (JavaFX)
> Gfx (Java2D)
Griffon MVC Groups
> Models - can use the @Bindable notation to provide data binding
- store the data for the MVC Group
> Views - represent a single display in your applications
- can be written in Groovy OR Java
> Controllers - the brains of the group
- can be injected with services
Binding
> general formats: - bind{model.property}
- bind(target:model, targetProperty:'name')
- bind(source:model, sourceProperty:'name')
> one-way
> mutual binding
Binding and SwingPad Demo
Griffon Lifecycle
> Initialize - run before any Swing code is started
> Startup - run after MVC Groups are initialized
> Ready - run after all events have been processed by the EDT
> Shutdown - all cleanup operations should run here
> Stop - only used by applets
The Evil Event Dispatching Thread
> edt - runs on the EDT using invokeAndWait
> doLater - runs on the EDT using invokeLater
> doOutside - spins up a thread to run if not already outside the EDT
> withWorker (SwingWorker) - for long running tasks where the UI might periodically update
Plugins
> are the delivery method to provide compile-time
functionality: - Builders
- Other JVM Language Support
- Testing Frameworks
- Addons
Addons
> add functionality at run-time
> can add or respond to runtime events
> can decorate MVC Groups
Guice Add-on
> injects methods and fields using the @Inject annotation
> Groovy removes the need for binding interfaces to
modules
> smaller footprint and faster than Spring
Guice Configurationapplication { title='TestGuice' startupGroups = ['TestGuice']
// Should Griffon exit when no Griffon created frames are showing? autoShutdown = true
// If you want some non-standard application class, apply it here //frameClass = 'javax.swing.JFrame'}/* truncated for brevity */
guice { injectInto = ["controller"] modules = ['NotifierModule']}
GuiceControllerclass TestguiceController { // these will be injected by Griffon def model def view @Inject Notifier notifier
void mvcGroupInit(Map args) { // this method is called after model and view are injected injector.injectMembers(this) // related settings from Application.groovy are injected notifier.sendNotification("hi") }}
Griffon Links
> Download: http://griffon.codehaus.org/Download
> Plugins/Addons: http://griffon.codehaus.org/Plugins
> User mailing list: [email protected]
> Dev mailing list: [email protected]
Griffon Team on Twitter
> James Williams (@ecspike)
> Danno Ferrin (@shemnon)
> Andres Almiray (@aalmiray)
> Josh Reed (@joshareed)
> Jim Shingler (@jshingler)
> Griffon News (@theaviary)