Re: Converting Java into J/link runnable code
- To: mathgroup at smc.vnet.net
- Subject: [mg104461] Re: Converting Java into J/link runnable code
- From: David Bailey <dave at removedbailey.co.uk>
- Date: Sun, 1 Nov 2009 03:59:45 -0500 (EST)
- References: <hcgmt3$cui$1@smc.vnet.net>
Garapata wrote:
> J/link seems like a good way to go to set up timers so, I found this
> short Java example that sets up a recurring beep. If I can get it to
> work, I can do a lot of other things with the ideas:
>
> import java.sql.Date;
> import java.util.Timer;
> import java.util.TimerTask;
> import java.awt.Toolkit;
>
> public class Main {
> public static void main (String[] argv) throws Exception {
> Date timeToRun =
> new Date (System.currentTimeMillis() +
> numberOfMillisecondsInTheFuture);
> Timer timer = new Timer();
>
> timer.schedule (new TimerTask() {
> public void run() {
> Toolkit.getDefaultToolkit.beep();
> }
> }, timeToRun);
> }
> }
> ______________
First, the Java code as written is partly schematic because the variable
numberOfMillisecondsInTheFuture needs to be replaced by an actual value.
Also, the Timer should be set up as a Daemon thread by passing the
argument true. If you make these changes, you end up with some runnable
Java code:
import java.sql.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Toolkit;
public class Main {
public static void main (String[] argv) throws Exception {
Date timeToRun =
new Date (System.currentTimeMillis() +
1117);
Timer timer = new Timer(true);
timer.schedule (new TimerTask() {
public void run() {
Toolkit.getDefaultToolkit().beep();
}
}, timeToRun);
}
}
To test this code, save it in a file Main.java, and type
javac Main.java
java Main
OK - so now you have some Java code that works on its own, so now you
can try hooking it up to Mathematica. First change the Class name to
something more sensible - e.g. MyTimerClass, and provide a method which
is not called Main, and which accepts the actual time delay you require:
import java.sql.Date;
import java.util.Timer;
import java.util.TimerTask;
import java.awt.Toolkit;
public class MyTimerClass {
public static void myTimer (int numberOfMillisecondsInTheFuture)
throws Exception {
Date timeToRun =
new Date (System.currentTimeMillis() +
numberOfMillisecondsInTheFuture);
Timer timer = new Timer(true);
timer.schedule (new TimerTask() {
public void run() {
Toolkit.getDefaultToolkit().beep();
}
}, timeToRun);
System.out.println("????????");
}
}
This should be stored in a file called MyTimerClass.java (the names of
source files are important in java) and compiled:
javac MyTimerClass.java
This will make a file MyTimerClass.class
Here is the Mathematica code required to call this static method:
In[1]:= Needs["JLink`"]
In[3]:= AddToClassPath["c:\\myjava"];
In[4]:= LoadJavaClass["MyTimerClass"];
In[8]:= MyTimerClass`myTimer[2000]
Replace the path c:\\myjava" with the directory containing your .class
file, and away you go!
Note that you can't just splice the Java source into your Mathematica
program as you have done! Also, you do not need to load the classes that
are used internally by your Java code.
Alternatively, it would be possible to avoid compiling any Java code, by
breaking up the steps inside myTimer into individual J/Link calls, but
this is somewhat less general, and probably more error prone.
David Bailey
http://www.dbaileyconsultancy.co.uk