From: Charles Oliver Nutter Date: 2007-10-30T04:08:23+09:00 Subject: Cheri: Builder-style JRuby/Swing GUI development Ara mentioned wanting to hear more about Swing-based GUI stuff in JRuby, so here's a quick intro to some of the frameworks available right now for doing Swing stuff. I'd like to know what people think of these and what's missing. There's a bunch, so I'll do this as separate posts. * Cheri (http://cheri.rubyforge.org/) "Cheri is a framework for creating builder applications; that is, applications that build or represent hierarchical, tree-like, structures, using a declarative syntax. Cheri includes a number of builders based on the framework, as well as a builder�builder for easily creating new builders or extending existing builders. Cheri also comes with a demo application, Cheri::JRuby::Explorer (CJX), that is built using two of the supplied builders (Cheri::Swing and Cheri::Html)." Cheri is very much a builder for Swing, hiding most aspects of the Swing component behind a declarative language. So here's a simple example: Hello World: @frame = swing.frame('Hello World') {|obj| size 200,150; box_layout obj, :Y_AXIS on_window_closing { puts 'bye!'; @frame.dispose } y_glue x_box { label 'Hello!' } y_glue } @frame.visible = true A simple HTML example: require 'cheri/swing' require 'cheri/html' include Cheri::Swing include Cheri::Html folks = { "Susan" =>"Wife", "Larry" =>"Son", "Bob" => "Friend","MaryAnne" => "Friend", } @frame = swing.frame('Swing and Html') { |frm| size 240,180; box_layout frm,:Y_AXIS content_pane { background :WHITE } default_close_operation :EXIT_ON_CLOSE menu_bar { menu('File') { mnemonic :VK_F menu_item('Exit') { mnemonic :VK_X on_click { @frame.dispose } }}} scroll_pane { align :LEFT editor_pane { content_type 'text/html' editable false background color(255,255,240) html {head { style "body { font-family: sans-serif; }" } body {div(:align=>:center) { table(:width=>'90%',:border=>1) { tr th('Name'), th('Relationship'), :bgcolor=>:yellow folks.each do |name,rel| tr(:bgcolor=>'#e0ffff') { td {name}; td {rel} } end }}}}}} } @frame.visible = true - Charlie