Cannot send a Java::int

I’m using JRuby and Swing. For the most part I’m amazed at how easily I
can create and handle my GUI, all from Ruby. JRuby is great!

In the example below (sorry it’s a little long), I see a crash at
startup:

Exception in thread “AWT-EventQueue-0” java.lang.ClassCastException:
java.lang.Long cannot be cast to java.lang.Integer

I know that the KeyEvent constant will be converted to a Ruby Fixnum,
which is converted to a Java::long (putValue to MNEMONIC_KEY). This
needs to be a Java::int, and the mismatch triggers the exception.

  • I’ve tried the java_send trick, but that second argument to putValue
    is a java.lang.Object.

  • I’ve tried calling to_java(:int) on the KeyEvent constant (or a
    variable holding that value), but the behavior is the same.

  • I’ve tried java_send(:putValue, [java.lang.String, Java::int]), but
    then JRuby complains that it can’t find that overload – because it
    doesn’t exist.

  • I’ve tried Java::int.new(…), but this gives me an error. My bet is
    that Java::int is an immediate class that doesn’t have a constructor.

  • I’ve tried java.lang.Object.new(a.to_java(:int)), but I get the same
    error.

I have a few more variations, but I think you get the idea. What is the
right way to do this? Or at this point, is there any way to get a
Java::int passed into a java.lang.Object parameter?

Thanks!

========= example code ==============
require ‘java’

class Demo
include_package ‘javax.swing’

def initialize
# create a menu to hook up to our Action object
mm = JMenu.new(‘Hi there’)
mi = JMenuItem.new(MyAction.new)
mbar = JMenuBar.new
mm.add(mi)
mbar.add(mm)
mbar.set_visible(true)

# create form
frm = JFrame.new "Simple demo"
frm.add(JTextArea.new("Just try to cut some text", 4, 20))
frm.setDefaultCloseOperation JFrame::EXIT_ON_CLOSE
frm.setJMenuBar(mbar)
frm.pack
frm.visible = true

end
end # class Demo

class MyAction < javax.swing.AbstractAction
include_package ‘javax.swing’
include_package ‘java.awt.event’

def initialize
super(“My action”)
self.putValue(SHORT_DESCRIPTION, “Silly dialog box”)
self.putValue(Action::ACCELERATOR_KEY,
KeyStroke.getKeyStroke(KeyEvent::VK_C, ActionEvent::CTRL_MASK))
self.putValue(Action::MNEMONIC_KEY, KeyEvent::VK_C)
end

def actionPerformed(evt)
JOptionPane.showMessageDialog(null, “My Action”, “This is my
action!”, JOptionPane::INFORMATION_MESSAGE)
end
end # class MyAction

javax.swing.SwingUtilities.invokeLater {Demo.new}
======= end example code ============


Ryan H.
L-3 Communications / Communication Systems West
[email protected]