::Swing

Cheri::Swing

To include:
require 'rubygems'
require 'cheri/swing'
 ...
include Cheri::Swing
Note that inclusion at the top level is not recommended.

Options:

swing[:auto]       #=> Enables auto mode
swing[:auto=>true] #=> (no swing/cheri block required)
Cheri::Swing (which includes Cheri::AWT) includes methods (Ruby-cased class names) for all javax.swing, javax.swing.border and java.awt classes, plus many in javax.swing.table, javax.swing.tree, java.awt.image and java.awt.geom. You can extend Cheri::Swing with other classes/packages (including 3rd party, or your own!) using the Cheri builder-builder's build_package method.

Cheri::Swing (and any other builder based on Cheri::Java) also provides easy-to-use on_xxx methods to implement event listeners. Any event listener supported by a class (through an addXxxListener method) can be accessed from Cheri::Swing using an on_xxx method (where xxx is the Ruby-cased event-method name). Because it is so widely used in Swing, the ActionListener#actionPerformed event method is aliased as on_click:

@frame = swing.frame('Hello') {
  size 500,500
  flow_layout
  on_window_closing {|event| @frame.dispose}
  button('Hit me') {
    on_click { puts 'button clicked' }
  }
}
The cherify and cheri_yield methods can be used to incorporate objects created outside the Cheri::Swing framework (cherify), or to re-introduce objects created earlier within the framework (cheri_yield):
class MyButton < javax.swing.JButton
 ...
end
 ...
a_button = MyButton.new
 ...
@frame = swing.frame('Hello') {
  size 500,500
  flow_layout
  cherify(a_button) {
    on_click { puts 'button clicked' }
  }  
}
  
@frame = swing.frame('Hello') {
  menu_bar {
    @file_menu = menu('File') {
      menu_item('Exit') {on_click {@frame.dispose } }
    }
  }  
}
# => add a new item later:
cheri_yield(@file_menu) {
  menu_item('Open...') {
    on_click { ... }
  }
}
The Cheri builder-builder can be used to extend Cheri::Swing in a couple of ways. Individual classes can be included using the build statement, while entire packages can be included using the build_package statement. Note that you may need to supply connection logic if the incorporated classes use methods other than add to connect child objects to parent objects; see file /lib/cheri/builder/swing/connecter.rb for many examples.
// Java:
package my.pkg;
public class MyParent extends javax.swing.JComponent {
  ...
  public void addChild(MyChild child) {
    ...
  }  
}
 ...
public class MyChild {
 ...
}
  
# JRuby:
require 'cheri/swing'
 ...
include Cheri::Swing
 ...
# easy-to-reference names; could use include_package instead
MyParent = Java::my.pkg.MyParent
MyChild = Java::my.pkg.MyChild
  
# example specifying each class; 'custom' names may be specified
MyBuilder = Cheri::Builder.new_builder do
  extend_builder Cheri::Swing
  build MyParent,:pappy
  build MyChild,:kiddo
  type MyParent do
    connect MyChild,:addChild
  end
end
  
include MyBuilder
@frame = swing.frame('My test') {
  ...
  panel {
    pappy {
      kiddo { ... }
    }
  }  
}
  
# example specifying package; default naming
MyBuilder = Cheri::Builder.new_builder do
  extend_builder Cheri::Swing
  build_package 'my.pkg'
  type MyParent do
    connect MyChild,:addChild
  end
end
  
include MyBuilder
@frame = swing.frame('My test') {
  ...
  panel {
    my_parent {
      my_child { ... }
    }
  }  
}
You can also use the builder-builder just to add conection logic to Cheri::Swing, as not every possible connection type is defined.

A Cheri::Swing examples section will be available soon. Until then, see the Cheri::JRuby::Explorer (CJX) code (under lib/cheri/jruby/explorer) for extensive examples of Cheri::Swing usage.

Copyright © 2007-2009 Bill Dortch