include Java

import java.awt.event.ActionListener
import javax.swing.JButton
import javax.swing.JFrame

class JButton
  def performed(type, &block)
    listener = Class.const_get("#{type.upcase}Listener").impl {|sym, *args| block.call(args[0]) }
    self.send("add_#{type}_listener", listener)
  end
end

button = JButton.new("hello")
frame = JFrame.new("frame")
frame.set_size(200,200)
frame.add button
frame.show

button.performed :action, {|event| event.source.text = 'goodbye'}