MathGroup Archive 2001

[Date Index] [Thread Index] [Author Index]

Search the Archive

Re: J/Link listeners

  • To: mathgroup at smc.vnet.net
  • Subject: [mg27225] Re: J/Link listeners
  • From: tgayley at wolfram.com (Todd Gayley)
  • Date: Mon, 12 Feb 2001 03:21:03 -0500 (EST)
  • Organization: Wolfram Research, Inc.
  • References: <9609h5$oft@smc.vnet.net>
  • Sender: owner-wri-mathgroup at wolfram.com

On 9 Feb 2001 03:25:09 -0500, murphee <werner.schuster at netway.at> wrote:

>yo Todd Gayley (and of course the rest of the group),
>
>the MathListener Util classes in J/Link make it very easy to write GUI 
>code, without writing (an deploying) classes;
>but, as soon as you need a Listener not defined in J/Link, you have to 
>write Java Code again
>(eg if you use some of the Swing Listeners like ChangeListener (for JSlider));
>
>I thinks it is possible to use the JDK 1.3 Dynamic Proxy API to add this to 
>J/Link;
>
>I know that everyone could use the DynamicProxy things on their own, but 
>having a little Utility class that hides
>all the ugly details would make J/Link even more useful;


Murphee,

This is a very clever suggestion. In fact, this feature has already been written and is
slated to be included in J/Link 1.2. The basic idea, as you obviously understand, is to
allow any Java interface to be implemented entirely in Mathematica code. This is a very
nice feature made possible by the new Dynamic Proxy API in Java 1.3.

For example, let's say you want an instance of a Java class that implements the Swing
CaretListener interface via callbacks to Mathematica. (You want such an object because you
have a JTextComponent and you want the Mathematica functions within highlighted text to
appear in red.) The CaretListener interface has one method:

    public void caretUpdate(CaretEvent e);

There is no MathCaretListener class built into J/Link, so in the current version of J/Link
you have to write some Java code to create your own version of such a class. In the next
release of J/Link, however, here is all you will need to do (the design is not finalized
yet):

obj = ImplementInterface["javax.swing.CaretListener", {"caretUpdate" ->
"caretUpdateHandler"}]

That's it. You now have a Java CaretListener object in Mathematica that will call the
Mathematica function caretUpdateHandler when CaretEvents are fired. Not a single line of
Java needed to be written to create this class and the obj instance (and in fact, just a
single line of Mathematica code).

Now write caretUpdateHandler:

caretUpdateHandler[caretEvent_?JavaObjectQ] := 
   (* Here you examine the caretEvent to determine the extent of the selection, then query
the JTextComponent for that region of text, look for Mathematica functions, etc., etc. *)


>something like MathGenericListener, with a setHandler method like the other 
>Math*Listeners;


There is already such a base class in J/Link 1.1 to help people who want to write their
own listener classes. It is called MathListener, and you can see how it is used by looking
at the source code for any of the MathXXXListener classes in J/Link, which are all
subclasses of it. MathListener makes it completely trivial to implement a listener class
that calls back into Mathematica. You don't have to deal with the link at all. As
discussed above, however, the next release of J/Link will make MathListener unnecessary,
and the small amount of Java code you now have to write to create such a listener will go
to zero.


>one drawback would be that at least JDK 1.3 would be required, but that 
>shouldn't be too much of a problem
>(except for the 4 or 5 MacOS 9 users ;) );


We're all looking forward to a fast and solid Java 1.3 implementation in Mac OS X.


Todd Gayley
Wolfram Research


  • Prev by Date: Re: (long) Re: Speed Challenge
  • Next by Date: Re: J/Link MathCanvas/Graphics/Interaction
  • Previous by thread: J/Link listeners
  • Next by thread: Solving a system of nonlinear equations containing integrals