Skip to content
daveray edited this page May 29, 2011 · 31 revisions

I've set up a Google Group for Seesaw discussion and questions: https://groups.google.com/group/seesaw-clj

Usage

See tests and src/seesaw/examples. Seriously, there are a lot of tests and they're pretty descriptive of how things work.

Let's create a JFrame:

(frame :title "Hello" :content "Hi there")

This will create a JFrame with title "Hello" and a single label "Hi there". The :content property expects something that can be turned into a widget and uses it as the content pane of the frame. Any place where a widget is expected, one will be created depending on the argument (see Widgets) ...

There are several examples at the moment. They're all in the src/seesaw/examples and can be run with lein like this:

$ lein deps
$ lein run -m seesaw.examples.<name-of-example>

To run the tests:

$ ./autotest.sh

Hopefully you see a nice wall of green. This runs laytest in "watch" mode. The tests will be re-run every time you modify a file. Basically all my development is like this:

  • Start the autotester and make sure everything's green
  • Write the test and watch for red or an exception
  • Write the code to make the test turn green again.
  • Refactor/cleanup, etc.

One nice thing is that if you have an example (like in src/seesaw/examples) if you call the main function there, lazytest will basically run the example over and over again. So you get a workflow like:

  • Write some of the example
  • Save
  • The window or whatever pops up automatically
  • Play with it, close it, and write some more

Of course, the examples should be tested, but they aren't :)

Topics

Here are topics covering most areas of Seesaw usage:

  • Project Setup - how to setup a project using Seesaw
  • Frames - How to create top-level frames/windows to contain your app.
  • Widgets - How to create widgets to populate your frames
  • Containers - All about container widgets, i.e. UI elements that simply contain other widgets like buttons, labels, etc.
  • Selectors - Using selectors to find widgets in your app
  • Actions - Defining "actions" that can be reused throughout your app in menus, buttons, etc.
  • Handling Events - Handling widget events
  • Handling Selection - Handling the current selection in a widget
  • Dialogs - Tell the user stuff. Ask the user stuff.
  • Menus - Menu bars, context menus, etc
  • Colors, Fonts - Specifying colors and fonts
  • Borders - Put borders on widgets
  • Tables - Working with tables
  • Graphics - Drawing stuff on the screen

Native Look and Feel

Call the (native!) function early in your program (like before any other Swing or Seesaw function is called) to get a more "native" behavior. This includes correct menu bar placement in OSX, etc.

A Note on Threading

As noted [here] (http://download.oracle.com/javase/6/docs/api/javax/swing/package-summary.html#threading) Swing is single threaded nearly all UI operations should be executed on the Swing UI dispatch thread. To facilitate this, Seesaw includes the (invoke-now) and (invoke-later) macros. The former executes forms on the UI thread and waits for their completion, while the latter simply schedules the forms for execution sometime in the future.

A typical use for (invoke-later) is to get things going in an app:

(defn -main [& args]
  (invoke-later
    (frame :title "Hello" :content (button :text "Push me"))))
Clone this wiki locally