Re: [jruby-user] JRubyFX

Christian MICHON <[email protected]> Thu, 30 Apr 2015 08:49:24 +0200
Newsgroups gmane.comp.lang.jruby.user
Message-ID <CACx2yF-QyPsi=fCXR5492H048owFqzMr0uWDQSRo0mm4aKaV2Q@mail.gmail.com>
--001a11c3ecfe0ba0500514eb7f8a
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

Maybe I can help out.

I've been toying for months now with Nashorn (jjs) but when I use Nashorn,
I only use jjs and do not embed the JS engine inside another java-based
interpreter.

1st: make sure your JDK8 is complete. It should not be the server JRE but
the full JDK8.

2nd: to confirm javafx is included in your environment, try the following
lines in jjs.

If javafx is not in your JDK8, you'll see this:

jjs> Java.type('javafx.beans.value.ChangeListener')
java.lang.RuntimeException: java.lang.ClassNotFoundException:
javafx.beans.value.ChangeListener

In that case, it'll never work in jruby and you need to reinstall JDK8
properly.

This is how it should look like in jjs if javafx is included in your
environment:

jjs> Java.type('javafx.beans.value.ChangeListener')
[JavaClass javafx.beans.value.ChangeListener]

Once this is ok, you just need to add the following line inside your ruby
script (preferably after require 'java') :

include_class Java::JavafxBeansValue::ChangeListener

Good luck!

On Wed, Apr 29, 2015 at 8:51 PM, Rodrigo Botafogo <
[email protected]> wrote:

> Tom,
>
> No, this doesn=C2=B4t work.  Could I do a require in my Ruby code somehow=
?
>
> require 'javafx.beans.value.ChangeListener' does not work as it is
> expecting a jar file, right?  Where is the jar for ChangeListener?
>
>
> Thanks,
>
> 2015-04-29 15:36 GMT-03:00 Thomas E Enebo <[email protected]>:
>
> I am less of a help for JS but if you see how WebView is defined above yo=
u
>> can perhaps do he same thing for ChangeListener is your JS code is barfi=
ng
>> because it does not know what that type is:
>>
>> var ChangeListener =3D Java.type("javafx.beans.value.ChangeListener");
>>
>> -Tom
>>
>> On Wed, Apr 29, 2015 at 1:32 PM, Rodrigo Botafogo <
>> [email protected]> wrote:
>>
>>> Hi Tom,
>>>
>>> Not sure I follow... so, the following function is defined inside a
>>> javascript file and not in a JRuby script.  I can=C2=B4t do this implic=
it
>>> coercion.  I think I should load the ChangeListener interface and make =
it
>>> available to javascript.  I=C2=B4m still learning all this, so I might =
just be
>>> confused.  If this is any help, I=C2=B4m just trying to follow the blog=
:
>>> https://blogs.oracle.com/nashorn/entry/porting_from_the_browser_to, but
>>> instead of using jjs, I=C2=B4m driving nashorn through JRuby.
>>>
>>>
>>> function WebViewWrapper(onload) {
>>>     var This =3D this;
>>>     var WebView =3D Java.type("javafx.scene.web.WebView");
>>>     var webview =3D new WebView();
>>>
>>>     This.webview =3D webview;
>>>     This.engine =3D webview.engine;
>>>     This.window =3D undefined;
>>>     This.document =3D undefined;
>>>
>>>     // Make sure the JavaScript is enabled.
>>>     This.engine.javaScriptEnabled =3D true;
>>>
>>>     // Complete initialization when page is loaded.
>>>     This.engine.loadWorker.stateProperty().addListener(new
>>> ChangeListener() {
>>>         changed: function(value, oldState, newState) {
>>>             if (newState =3D=3D Worker.State.SUCCEEDED) {
>>>                 This.document =3D
>>> wrap(This.engine.executeScript("document"));
>>>                 This.window =3D wrap(This.engine.executeScript("window"=
));
>>>
>>>                 // Call users onload function.
>>>                 if (onload) {
>>>                     onload(This);
>>>                 }
>>>             }
>>>         }
>>>     });
>>>
>>>
>>> Thanks....
>>>
>>> 2015-04-29 15:20 GMT-03:00 Thomas E Enebo <[email protected]>:
>>>
>>> javafx.beans.value.ChangeListener is an interface so with implicit
>>>> closure coercion you should be able to:
>>>>
>>>>
>>>> ```ruby
>>>> This.engine.load_worker.state_property.add_listener do |observable,
>>>> old_value, new_value|
>>>>   #...
>>>> end
>>>> ```
>>>>
>>>> -Tom
>>>>
>>>>
>>>> On Wed, Apr 29, 2015 at 11:42 AM, Rodrigo Botafogo <
>>>> [email protected]> wrote:
>>>>
>>>>> Hello....
>>>>>
>>>>> Sorry if this isn=C2=B4t the right place to post questions about JRub=
yFX.
>>>>>
>>>>> I=C2=B4m trying to write a JRubyFX application.  I=C2=B4m following a=
 post from
>>>>> Oracle to try to learn JavaFX and JRubyFx.  In the post, in a js file=
 there
>>>>> is the following lines:
>>>>>
>>>>>  // Complete initialization when page is loaded.
>>>>>   This.engine.loadWorker.stateProperty().addListener(new ChangeListen=
er() {
>>>>>
>>>>>
>>>>> ChangeListener() is not found when I run the application.  I
>>>>> understand that I should load javafx/beans, but I don=C2=B4t know how=
 to do this
>>>>> with JRubyFX.  Can anybody help me here or point to the right list to=
 ask
>>>>> this question?
>>>>>
>>>>> Thanks
>>>>> --
>>>>> Rodrigo Botafogo
>>>>>
>>>>>
>>>>>
>>>>>
>>>>
>>>>
>>>> --
>>>> blog: http://blog.enebo.com       twitter: tom_enebo
>>>> mail: [email protected]
>>>>
>>>
>>>
>>>
>>> --
>>> Rodrigo Botafogo
>>>
>>>
>>>
>>>
>>
>>
>> --
>> blog: http://blog.enebo.com       twitter: tom_enebo
>> mail: [email protected]
>>
>
>
>
> --
> Rodrigo Botafogo
>
>
>
>


--=20
Christian

--001a11c3ecfe0ba0500514eb7f8a
Content-Type: text/html; charset=UTF-8
Content-Transfer-Encoding: quoted-printable

<div dir=3D"ltr">Maybe I can help out.<div><br></div><div>I&#39;ve been toy=
ing for months now with Nashorn (jjs) but when I use Nashorn, I only use jj=
s and do not embed the JS engine inside another java-based interpreter.<div=
><br></div><div>1st: make sure your JDK8 is complete. It should not be the =
server JRE but the full JDK8.</div><div><br></div><div>2nd: to confirm java=
fx is included in your environment, try the following lines in jjs.</div><d=
iv><br></div><div>If javafx is not in your JDK8, you&#39;ll see this:</div>=
<div><br></div><div><div>jjs&gt; Java.type(&#39;javafx.beans.value.ChangeLi=
stener&#39;)<br></div><div>java.lang.RuntimeException: java.lang.ClassNotFo=
undException: javafx.beans.value.ChangeListener</div></div><div><br></div><=
div>In that case, it&#39;ll never work in jruby and you need to reinstall J=
DK8 properly.</div><div><br></div><div>This is how it should look like in j=
js if javafx is included in your environment:</div><div><br></div><div><div=
>jjs&gt; Java.type(&#39;javafx.beans.value.ChangeListener&#39;)<br></div><d=
iv>[JavaClass javafx.beans.value.ChangeListener]</div></div><div><br></div>=
<div>Once this is ok, you just need to add the following line inside your r=
uby script (preferably after require &#39;java&#39;) :</div></div><div><br>=
</div><div>include_class Java::JavafxBeansValue::ChangeListener<br></div><d=
iv><br></div><div>Good luck!</div></div><div class=3D"gmail_extra"><br><div=
 class=3D"gmail_quote">On Wed, Apr 29, 2015 at 8:51 PM, Rodrigo Botafogo <s=
pan dir=3D"ltr">&lt;<a href=3D"mailto:[email protected]" target=
=3D"_blank">[email protected]</a>&gt;</span> wrote:<br><blockquot=
e class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc sol=
id;padding-left:1ex"><div dir=3D"ltr">Tom,<div><br></div><div>No, this does=
n=C2=B4t work.=C2=A0 Could I do a require in my Ruby code somehow?=C2=A0</d=
iv><div><br></div><div>require &#39;javafx.beans.value.ChangeListener&#39; =
does not work as it is expecting a jar file, right?=C2=A0 Where is the jar =
for ChangeListener?</div><div><br></div><div><br></div><div>Thanks,</div></=
div><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">2015-04-29 15=
:36 GMT-03:00 Thomas E Enebo <span dir=3D"ltr">&lt;<a href=3D"mailto:tom.en=
[email protected]" target=3D"_blank">[email protected]</a>&gt;</span>:<div><d=
iv class=3D"h5"><br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0=
 .8ex;border-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><d=
iv>I am less of a help for JS but if you see how WebView is defined above y=
ou can perhaps do he same thing for ChangeListener is your JS code is barfi=
ng because it does not know what that type is:<br><br></div>var ChangeListe=
ner =3D Java.type(&quot;javafx.beans.value.ChangeListener&quot;);<br><br></=
div>-Tom<br></div><div><div><div class=3D"gmail_extra"><br><div class=3D"gm=
ail_quote">On Wed, Apr 29, 2015 at 1:32 PM, Rodrigo Botafogo <span dir=3D"l=
tr">&lt;<a href=3D"mailto:[email protected]" target=3D"_blank">ro=
[email protected]</a>&gt;</span> wrote:<br><blockquote class=3D"gma=
il_quote" style=3D"margin:0 0 0 .8ex;border-left:1px #ccc solid;padding-lef=
t:1ex"><div dir=3D"ltr">Hi Tom,<div><br></div><div>Not sure I follow... so,=
 the following function is defined inside a javascript file and not in a JR=
uby script.=C2=A0 I can=C2=B4t do this implicit coercion.=C2=A0 I think I s=
hould load the ChangeListener interface and make it available to javascript=
.=C2=A0 I=C2=B4m still learning all this, so I might just be confused.=C2=
=A0 If this is any help, I=C2=B4m just trying to follow the blog:=C2=A0<a h=
ref=3D"https://blogs.oracle.com/nashorn/entry/porting_from_the_browser_to" =
target=3D"_blank">https://blogs.oracle.com/nashorn/entry/porting_from_the_b=
rowser_to</a>, but instead of using jjs, I=C2=B4m driving nashorn through J=
Ruby.</div><div><br></div><div><br></div><div><div>function WebViewWrapper(=
onload) {</div><div>=C2=A0 =C2=A0 var This =3D this;</div><div>=C2=A0 =C2=
=A0 var WebView =3D Java.type(&quot;javafx.scene.web.WebView&quot;);</div><=
div>=C2=A0 =C2=A0 var webview =3D new WebView();</div><div>=C2=A0 =C2=A0=C2=
=A0</div><div>=C2=A0 =C2=A0 This.webview =3D webview;</div><div>=C2=A0 =C2=
=A0 This.engine =3D webview.engine;</div><div>=C2=A0 =C2=A0 This.window =3D=
 undefined;</div><div>=C2=A0 =C2=A0 This.document =3D undefined;</div><div>=
=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 // Make sure the JavaScript is =
enabled.</div><div>=C2=A0 =C2=A0 This.engine.javaScriptEnabled =3D true;</d=
iv><span><div>=C2=A0 =C2=A0=C2=A0</div><div>=C2=A0 =C2=A0 // Complete initi=
alization when page is loaded.</div><div>=C2=A0 =C2=A0 This.engine.loadWork=
er.stateProperty().addListener(new ChangeListener() {</div></span><div>=C2=
=A0 =C2=A0 =C2=A0 =C2=A0 changed: function(value, oldState, newState) {</di=
v><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 if (newState =3D=3D Worker=
.State.SUCCEEDED) {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 This.document =3D wrap(This.engine.executeScript(&quot;document&=
quot;));</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =
This.window =3D wrap(This.engine.executeScript(&quot;window&quot;));</div><=
div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0=C2=A0</div><div=
>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 // Call users onlo=
ad function.</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 if (onload) {</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 onload(This);</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 =C2=A0 =C2=A0 =C2=A0 }</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 =C2=
=A0 =C2=A0 }</div><div>=C2=A0 =C2=A0 =C2=A0 =C2=A0 }</div><div>=C2=A0 =C2=
=A0 });</div></div><div><br></div><div><br></div><div>Thanks....</div></div=
><div class=3D"gmail_extra"><br><div class=3D"gmail_quote">2015-04-29 15:20=
 GMT-03:00 Thomas E Enebo <span dir=3D"ltr">&lt;<a href=3D"mailto:tom.enebo=
@gmail.com" target=3D"_blank">[email protected]</a>&gt;</span>:<div><div>=
<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;border-lef=
t:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr"><div><div><div>javafx.b=
eans.value.ChangeListener is an interface so with implicit closure coercion=
 you should be able to:<br></div><div><br><br></div>```ruby<br></div>This.e=
ngine.load_worker.state_property.add_listener do |<code>observable, old_val=
ue, new_value|<br>=C2=A0 #...<br></code></div><code>end<br></code><div><div=
>```<br><br></div><div>-Tom<br><br></div></div></div><div class=3D"gmail_ex=
tra"><div><div><br><div class=3D"gmail_quote">On Wed, Apr 29, 2015 at 11:42=
 AM, Rodrigo Botafogo <span dir=3D"ltr">&lt;<a href=3D"mailto:rodrigo@rodri=
gobotafogo.com" target=3D"_blank">[email protected]</a>&gt;</span=
> wrote:<br><blockquote class=3D"gmail_quote" style=3D"margin:0 0 0 .8ex;bo=
rder-left:1px #ccc solid;padding-left:1ex"><div dir=3D"ltr">Hello....=C2=A0=
<div><br></div><div>Sorry if this isn=C2=B4t the right place to post questi=
ons about JRubyFX. =C2=A0</div><div><br></div><div>I=C2=B4m trying to write=
 a JRubyFX application.=C2=A0 I=C2=B4m following a post from Oracle to try =
to learn JavaFX and JRubyFx.=C2=A0 In the post, in a js file there is the f=
ollowing lines:</div><div><br></div><div><pre style=3D"margin-top:10px;marg=
in-bottom:10px;color:rgb(85,85,85);font-size:12px;line-height:18px"> // Com=
plete initialization when page is loaded.
  This.engine.loadWorker.stateProperty().addListener(new ChangeListener()=
=C2=A0{</pre><pre style=3D"margin-top:10px;margin-bottom:10px;color:rgb(85,=
85,85);font-size:12px;line-height:18px"><br></pre><div>ChangeListener() is =
not found when I run the application.=C2=A0 I understand that I should load=
 javafx/beans, but I don=C2=B4t know how to do this with JRubyFX.=C2=A0 Can=
 anybody help me here or point to the right list to ask this question?</div=
><div><br></div><div>Thanks</div><span><font color=3D"#888888">-- <br><div>=
<div dir=3D"ltr">Rodrigo Botafogo<div><br><br><div><br></div></div></div></=
div>
</font></span></div></div>
</blockquote></div><br><br clear=3D"all"><br></div></div><span><font color=
=3D"#888888">-- <br><div>blog: <a href=3D"http://blog.enebo.com" target=3D"=
_blank">http://blog.enebo.com</a>=C2=A0 =C2=A0 =C2=A0=C2=A0 twitter: tom_en=
ebo<br>mail: <a href=3D"mailto:[email protected]" target=3D"_blank">tom.e=
[email protected]</a></div>
</font></span></div>
</blockquote></div></div></div><span><font color=3D"#888888"><br><br clear=
=3D"all"><div><br></div>-- <br><div><div dir=3D"ltr">Rodrigo Botafogo<div><=
br><br><div><br></div></div></div></div>
</font></span></div>
</blockquote></div><br><br clear=3D"all"><br>-- <br><div>blog: <a href=3D"h=
ttp://blog.enebo.com" target=3D"_blank">http://blog.enebo.com</a>=C2=A0 =C2=
=A0 =C2=A0=C2=A0 twitter: tom_enebo<br>mail: <a href=3D"mailto:tom.enebo@gm=
ail.com" target=3D"_blank">[email protected]</a></div>
</div>
</div></div></blockquote></div></div></div><span class=3D"HOEnZb"><font col=
or=3D"#888888"><br><br clear=3D"all"><div><br></div>-- <br><div><div dir=3D=
"ltr">Rodrigo Botafogo<div><br><br><div><br></div></div></div></div>
</font></span></div>
</blockquote></div><br><br clear=3D"all"><div><br></div>-- <br><div class=
=3D"gmail_signature">Christian<br></div>
</div>

--001a11c3ecfe0ba0500514eb7f8a--