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]