require 'java' class SwingBuilder def initialize @me = nil end def method_missing(sym, *args, &block) if sym.to_s == "layout" cls = eval("java.awt.#{args[0].to_s.split('_').collect do |s|; s.capitalize; end.join}Layout") return @me.layout = cls.new end if @me.respond_to? sym @me.send(sym, *args, &block) else cls = eval("javax.swing.J#{sym.to_s.split('_').collect do |s|; s.capitalize; end.join}") if block @oldme = @me if @oldme @oldme.add(@me = cls.new(*args)) else @me = cls.new(*args) end @top ||= @me self.instance_eval(&block) @me = @oldme else @me.add(cls.new(*args)) end @top end end end sw = SwingBuilder.new frame = sw.frame("My Frame") { layout :flow button("A Button") text_field("A Text Field") set_size 500, 500 always_on_top = true } frame.show