A proof of concept
//Factory.java public class Factory { private Factory(){} public static Object Build(String classname) throws InstantiationException, IllegalAccessException, ClassNotFoundException { Class target = Class.forName(classname); return target.newInstance(); } }
//Utility.java package Tinesware.Adapter; public class Utility { private Utility() { } public static void exit(int status) { java.lang.System.exit(status); } }
//WindowAdapter.java package Tinesware.Adapter; public class WindowAdapter implements java11.awt.event.WindowListener { private final Ruby.Object payload; public WindowAdapter(Ruby.Object arg) { payload = arg; } public void windowActivated(java11.awt.event.WindowEvent e) { } public void windowClosed(java11.awt.event.WindowEvent e) { System.out.println("window Closed"); Object[] args = {e}; Ruby.Runtime.Eval.Call(payload, "windowClosed", args); } public void windowClosing(java11.awt.event.WindowEvent e) { System.out.println("window Closing"); Object[] args = { e }; Ruby.Runtime.Eval.Call(payload, "windowClosing", args); } public void windowDeactivated(java11.awt.event.WindowEvent e) { } public void windowDeiconified(java11.awt.event.WindowEvent e) { } public void windowIconified(java11.awt.event.WindowEvent e) { } public void windowOpened(java11.awt.event.WindowEvent e) { } }
##Program.rb require 'Tinesware.Adapter.dll' require 'gwt221.dll' window = Tinesware::Adapter::Factory.Build("dtai.gwt.GadgetFrame"); window.setSize (800, 600) window.setTitle 'Proof of Concept' window.show class WindowHandler def initialize(w) @window = w end def windowClosing(e) @window.hide end def windowClosed(e) Tinesware::Adapter::Utility.exit 0 end end adapter = Tinesware::Adapter::WindowAdapter.new(WindowHandler.new(window)) window.addWindowListener adapter
It only works grace of Ruby.Runtime.Eval.Call()
being public, but that's all I need; that the event argument gets through is a bonus.
It is a mild hack, it does involve repetitive boilerplate coding, but you only have to do it for a few interface classes. And it will need some smoothing over on the Ruby side to make it look less awkward with code that's supposed to interoperate with Java as JRuby.
Extra bonus -- if the Call()
'd method doesn't exist, it does nothing silently, so you only have to implement the parts of an interface you actually want.
No comments:
Post a Comment