tag:blogger.com,1999:blog-62245955975880144952024-03-13T12:05:48.401+01:00Paddy's WeblogPaddy's Techno (Java, Java EE,Java FX, Ruby, Mac OS X, ...) WeblogPatrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.comBlogger73125tag:blogger.com,1999:blog-6224595597588014495.post-1115410315217662672017-09-01T22:33:00.000+01:002017-09-01T22:34:39.281+01:00You can now read me on Medium tooYou can now read me on Medium too<br />
<a href="https://medium.com/@patrick.champion">https://medium.com/@patrick.champion</a><br />
<br />
And my first story on Medium is : <a href="https://medium.com/@patrick.champion/porting-arkit-by-example-part-2-part-3-from-mark-dawson-to-swift-a0fc0631453d">Porting ARKIt by Example (part 2 & part 3) from Mark Dawson to Swift</a>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-44448849130486349372013-09-16T22:59:00.000+01:002013-09-16T22:59:58.627+01:00Lambda and JavaFX 8.0<div class="Standard">
Updating my Mac with:</div>
<div class="Standard">
</div>
<ul>
<li><a href="https://netbeans.org/community/releases/74/">Netbeans 7.4 Beta</a></li>
<li><a href="http://jdk8.java.net/download.html">last JDK 8 version</a>(Developer preview Build b 106)</li>
</ul>
Now, let's try to play
with <a href="http://openjdk.java.net/projects/lambda/">Lambda</a> … and JavaFX 8.0<br /><br />My first try is a
classical replace of the <i>ActionEvent</i> of a button by a Lambda and a less
classical call of an existing method by using method references.<div class="Standard">
<o:p></o:p></div>
<div class="Standard">
And my second try is to
rewrite <a href="http://paddyweblog.blogspot.fr/2011/07/duke-anim-in-javafx-20-b34.html">Duke Anim</a> with Lambda.<o:p></o:p></div>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/IX84ip7irdU?feature=player_embedded' frameborder='0'></iframe></div>
<div class="Standard">
</div>
<a name='more'></a><br />
<div class="Standard">
<b><u>Button action
with Lambda and method references</u></b></div>
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST5 {font-family: Monospaced; font-weight: bold; font-style: italic}
.ST3 {font-family: Monospaced; font-style: italic}
.ST1 {font-family: Monospaced; font-weight: bold}
.ST0 {color: #969696; font-family: Monospaced; font-weight: bold}
.comment {color: #969696}
.ST2 {color: #009900}
.character {color: #ce7b00}
.ST4 {color: #009900; font-family: Monospaced; font-style: italic}
.keyword-directive {color: #0000e6}
.ST21 {font-family: Monospaced; font-style: italic}
.ST01 {font-family: Monospaced; font-weight: bold}
.ST11 {color: #009900}
.ST31 {color: #009900; font-family: Monospaced; font-style: italic}
.ST32 {font-family: Monospaced; font-weight: bold; font-style: italic}
.ST42 {font-family: Monospaced; font-style: italic}
.ST12 {font-family: Monospaced; font-weight: bold}
.ST02 {color: #969696; font-family: Monospaced; font-weight: bold}
.ST22 {color: #009900}
.ST52 {color: #009900; font-family: Monospaced; font-style: italic}
.ST23 {font-family: Monospaced; font-weight: bold; font-style: italic}
.ST33 {font-family: Monospaced; font-style: italic}
.ST03 {font-family: Monospaced; font-weight: bold}
.ST13 {color: #009900; font-family: Monospaced; font-style: italic}
-->
</style>
<table width="100%"><tr><td align="center">/ButtonJavaFX8Lambda.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> buttonjavafx8lambda;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> javafx.event.ActionEvent;
<span class="keyword-directive">import</span> javafx.geometry.Insets;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.scene.control.Button;
<span class="keyword-directive">import</span> javafx.scene.layout.VBox;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST03">ButtonJavaFX8Lambda</span> <span class="keyword-directive">extends</span> Application {
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST03">test</span>(ActionEvent e){
System.<span class="ST13">out</span>.println(<span class="character">"</span><span class="character">Hello World method references</span><span class="character">"</span>);
}
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST23">testStatic</span>(ActionEvent e){
System.<span class="ST13">out</span>.println(<span class="character">"</span><span class="character">Hello World method references static</span><span class="character">"</span>);
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST03">start</span>(Stage primaryStage) {
Button btn = <span class="keyword-directive">new</span> Button();
Button btn2 = <span class="keyword-directive">new</span> Button();
btn.setText(<span class="character">"</span><span class="character">Say 'Hello World Lambda'</span><span class="character">"</span>);
btn2.setText(<span class="character">"</span><span class="character">Say 'Hello World method references'</span><span class="character">"</span>);
<b>
<span class="comment">// Lambda</span>
btn.setOnAction(e->{
System.<span class="ST13">out</span>.println(<span class="character">"</span><span class="character">Hello World Lambda</span><span class="character">"</span>);
});
<span class="comment">// method references </span>
btn2.setOnAction(<span class="keyword-directive">this</span>::test);
<span class="comment">//// method references (static method)</span>
<span class="comment">//btn2.setOnAction(ButtonJavaFX8Lambda::testStatic);</span>
</b>
VBox root = <span class="keyword-directive">new</span> VBox();
root.setSpacing(10);
root.setPadding(<span class="keyword-directive">new</span> Insets(50, 30, 50, 30));
root.getChildren().add(btn);
root.getChildren().add(btn2);
Scene scene = <span class="keyword-directive">new</span> Scene(root, 300, 250);
primaryStage.setTitle(<span class="character">"</span><span class="character">Hello World!</span><span class="character">"</span>);
primaryStage.setScene(scene);
primaryStage.show();
}
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST23">main</span>(String[] args) {
<span class="ST33">launch</span>(args);
}
}
</pre>
<div class="Standard">
<b><u>Rewriting Duke
Anim with Lambda</u></b></div>
<div class="Standard">
Builders are deprecated
in JavaFX 8.0, so I began to rewrite Duke Anim without the builders.<o:p></o:p></div>
<table width="100%"><tr><td align="center">DukeAnimJavaFX8.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> dukeanimjavafx8;
<span class="keyword-directive">import</span> javafx.animation.Interpolator;
<span class="keyword-directive">import</span> javafx.animation.KeyFrame;
<span class="keyword-directive">import</span> javafx.animation.KeyValue;
<span class="keyword-directive">import</span> javafx.animation.Timeline;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> javafx.beans.property.IntegerProperty;
<span class="keyword-directive">import</span> javafx.beans.property.SimpleIntegerProperty;
<span class="keyword-directive">import</span> javafx.event.ActionEvent;
<span class="keyword-directive">import</span> javafx.event.EventHandler;
<span class="keyword-directive">import</span> javafx.scene.Group;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.scene.image.Image;
<span class="keyword-directive">import</span> javafx.scene.image.ImageView;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">import</span> javafx.util.Duration;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST12">DukeAnimJavaFX8</span> <span class="keyword-directive">extends</span> Application {
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST12">start</span>(Stage primaryStage) {
DukeAnimModel dukeAnimModel = <span class="keyword-directive">new</span> DukeAnimModel();
dukeAnimModel.initTimeline();
dukeAnimModel.<span class="ST22">timeline</span>.play();
primaryStage.setTitle(<span class="character">"</span><span class="character">DukeAnim JavaFX 8(b99)</span><span class="character">"</span>);
Image image = <span class="keyword-directive">new</span> Image(DukeAnimJavaFX8.<span class="keyword-directive">class</span>.getResourceAsStream(<span class="character">"</span><span class="character">images/duke.png</span><span class="character">"</span>));
ImageView imageView = <span class="keyword-directive">new</span> ImageView();
imageView.setImage(image);
Group root = <span class="keyword-directive">new</span> Group();
root.getChildren().add(imageView);
Scene scene = <span class="keyword-directive">new</span> Scene(root,240,320);
imageView.xProperty().bind(dukeAnimModel.<span class="ST22">x</span>);
imageView.yProperty().bind(dukeAnimModel.<span class="ST22">y</span>);
primaryStage.setScene(scene);
primaryStage.show();
}
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST32">main</span>(String[] args) {
<span class="ST42">launch</span>(args);
}
}
<span class="keyword-directive">class</span> <span class="ST12">DukeAnimModel</span> {
<span class="keyword-directive">private</span> EventHandler <span class="ST22">action</span> = <span class="keyword-directive">new</span> EventHandler<ActionEvent>() {
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST12">handle</span>(ActionEvent t) {
System.<span class="ST52">out</span>.println(<span class="character">"</span><span class="character">x : </span><span class="character">"</span> + <span class="ST22">x</span>);
System.<span class="ST52">out</span>.println(<span class="character">"</span><span class="character">y : </span><span class="character">"</span> + <span class="ST22">y</span>);
<span class="keyword-directive">int</span> xTarget = (<span class="keyword-directive">new</span> Double(java.lang.Math.<span class="ST42">random</span>() * 240 + 1)).intValue();
<span class="keyword-directive">int</span> yTarget = (<span class="keyword-directive">new</span> Double(java.lang.Math.<span class="ST42">random</span>() * 320 + 1)).intValue();
System.<span class="ST52">out</span>.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + xTarget);
System.<span class="ST52">out</span>.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + yTarget);
KeyFrame kf1s = buildKeyFrame(xTarget, yTarget);
<span class="ST22">timeline</span>.stop();
<span class="ST22">timeline</span>.getKeyFrames().remove(0);
<span class="ST22">timeline</span>.getKeyFrames().add(kf1s);
<span class="ST22">timeline</span>.play();
}
};
<span class="keyword-directive">private</span> KeyFrame <span class="ST12">buildKeyFrame</span>(<span class="keyword-directive">int</span> xTarget, <span class="keyword-directive">int</span> yTarget) {
Duration t1 = <span class="keyword-directive">new</span> Duration(1000);
KeyValue kvx1s = <span class="keyword-directive">new</span> KeyValue(<span class="ST22">x</span>, xTarget, Interpolator.<span class="ST42">SPLINE</span>(0, 0.5, 0.5, 1));
KeyValue kvy1s = <span class="keyword-directive">new</span> KeyValue(<span class="ST22">y</span>, yTarget, Interpolator.<span class="ST42">SPLINE</span>(0, 0.5, 0.5, 1));
KeyFrame kf1s = <span class="keyword-directive">new</span> KeyFrame(t1, <span class="ST22">action</span>, kvx1s, kvy1s);
<span class="keyword-directive">return</span> kf1s;
}
<span class="keyword-directive">public</span> IntegerProperty <span class="ST22">x</span> = <span class="keyword-directive">new</span> SimpleIntegerProperty(0);
<span class="keyword-directive">public</span> IntegerProperty <span class="ST22">y</span> = <span class="keyword-directive">new</span> SimpleIntegerProperty(0);
<span class="keyword-directive">public</span> Timeline <span class="ST22">timeline</span> = <span class="keyword-directive">new</span> Timeline();
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST12">initTimeline</span>(){
<span class="ST22">timeline</span>.setAutoReverse(<span class="keyword-directive">true</span>);
<span class="ST22">timeline</span>.setCycleCount(Timeline.<span class="ST52">INDEFINITE</span>);
<span class="ST22">timeline</span>.getKeyFrames().add(buildKeyFrame(0,0));
}
}
</pre>
<div class="Standard">
Then I replace the <i>ActionEvent</i>
of the <i>KeyFrame</i> by a Lambda<o:p></o:p></div>
<table width="100%"><tr><td align="center">DukeAnimModel</td></tr></table>
<pre>
<span class="keyword-directive">class</span> <span class="ST01">DukeAnimModel</span> {
<span class="keyword-directive">private</span> KeyFrame <span class="ST01">buildKeyFrame</span>(<span class="keyword-directive">int</span> xTarget, <span class="keyword-directive">int</span> yTarget) {
Duration t1 = <span class="keyword-directive">new</span> Duration(1000);
KeyValue kvx1s = <span class="keyword-directive">new</span> KeyValue(<span class="ST11">x</span>, xTarget, Interpolator.<span class="ST21">SPLINE</span>(0, 0.5, 0.5, 1));
KeyValue kvy1s = <span class="keyword-directive">new</span> KeyValue(<span class="ST11">y</span>, yTarget, Interpolator.<span class="ST21">SPLINE</span>(0, 0.5, 0.5, 1));
KeyFrame kf1s = <span class="keyword-directive">new</span> KeyFrame(t1,
a -> {
System.<span class="ST31">out</span>.println(<span class="character">"</span><span class="character">x : </span><span class="character">"</span> + <span class="ST11">x</span>);
System.<span class="ST31">out</span>.println(<span class="character">"</span><span class="character">y : </span><span class="character">"</span> + <span class="ST11">y</span>);
<span class="keyword-directive">int</span> xTarget1 = (<span class="keyword-directive">new</span> Double(java.lang.Math.<span class="ST21">random</span>() * 240 + 1)).intValue();
<span class="keyword-directive">int</span> yTarget1 = (<span class="keyword-directive">new</span> Double(java.lang.Math.<span class="ST21">random</span>() * 320 + 1)).intValue();
System.<span class="ST31">out</span>.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + xTarget1);
System.<span class="ST31">out</span>.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + yTarget1);
<span class="ST11">timeline</span>.stop();
<span class="ST11">timeline</span>.getKeyFrames().remove(0);
<span class="ST11">timeline</span>.getKeyFrames().add(buildKeyFrame(xTarget1, yTarget1));
<span class="ST11">timeline</span>.play();
},
kvx1s, kvy1s);
<span class="keyword-directive">return</span> kf1s;
}
<span class="keyword-directive">public</span> IntegerProperty <span class="ST11">x</span> = <span class="keyword-directive">new</span> SimpleIntegerProperty(0);
<span class="keyword-directive">public</span> IntegerProperty <span class="ST11">y</span> = <span class="keyword-directive">new</span> SimpleIntegerProperty(0);
<span class="keyword-directive">public</span> Timeline <span class="ST11">timeline</span> = <span class="keyword-directive">new</span> Timeline();
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST01">initTimeline</span>(){
<span class="ST11">timeline</span>.setAutoReverse(<span class="keyword-directive">true</span>);
<span class="ST11">timeline</span>.setCycleCount(Timeline.<span class="ST31">INDEFINITE</span>);
<span class="ST11">timeline</span>.getKeyFrames().add(buildKeyFrame(0,0));
}
}
</pre>
<div class="Standard">
And I finish by rewrite
the <i>buildKeyFrame</i> method as a Lambda, by using the <i>BiFunction</i>
interface which allows to create a Lambda with 2 inputs parameters.<br />
To execute the Lambda, just call the method <i>apply</i> with 2 parameters.<br />Ok, in this case, write
this code with a Lambda brings nothing... it's just to try ;) and to show how
write a Lambda and execute a Lambda.</div>
<div class="Standard">
<o:p></o:p></div>
<div class="Standard">
<table width="100%"><tr><td align="center">DukeAnimJavaFX8Lambda.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> dukeanimjavafx8lambda;
<span class="keyword-directive">import</span> java.util.function.BiFunction;
<span class="keyword-directive">import</span> javafx.animation.Interpolator;
<span class="keyword-directive">import</span> javafx.animation.KeyFrame;
<span class="keyword-directive">import</span> javafx.animation.KeyValue;
<span class="keyword-directive">import</span> javafx.animation.Timeline;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> <span class="keyword-directive">static</span> javafx.application.Application.launch;
<span class="keyword-directive">import</span> javafx.beans.property.IntegerProperty;
<span class="keyword-directive">import</span> javafx.beans.property.SimpleIntegerProperty;
<span class="keyword-directive">import</span> javafx.scene.Group;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.scene.image.Image;
<span class="keyword-directive">import</span> javafx.scene.image.ImageView;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">import</span> javafx.util.Duration;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST1">DukeAnimJavaFX8Lambda</span> <span class="keyword-directive">extends</span> Application {
<span class="keyword-directive">public</span> IntegerProperty <span class="ST2">x</span> = <span class="keyword-directive">new</span> SimpleIntegerProperty(0);
<span class="keyword-directive">public</span> IntegerProperty <span class="ST2">y</span> = <span class="keyword-directive">new</span> SimpleIntegerProperty(0);
<span class="keyword-directive">public</span> Timeline <span class="ST2">timeline</span> = <span class="keyword-directive">new</span> Timeline();
BiFunction<Integer,Integer,KeyFrame> <span class="ST2">buildKeyFrame</span> = (Integer xTarget, Integer yTarget) -> {
Duration t1 = <span class="keyword-directive">new</span> Duration(1000);
KeyValue kvx1s = <span class="keyword-directive">new</span> KeyValue(<span class="ST2">x</span>, xTarget, Interpolator.<span class="ST3">SPLINE</span>(0, 0.5, 0.5, 1));
KeyValue kvy1s = <span class="keyword-directive">new</span> KeyValue(<span class="ST2">y</span>, yTarget, Interpolator.<span class="ST3">SPLINE</span>(0, 0.5, 0.5, 1));
KeyFrame kf1s = <span class="keyword-directive">new</span> KeyFrame(t1,
a -> {
System.<span class="ST4">out</span>.println(<span class="character">"</span><span class="character">x : </span><span class="character">"</span> + <span class="ST2">x</span>);
System.<span class="ST4">out</span>.println(<span class="character">"</span><span class="character">y : </span><span class="character">"</span> + <span class="ST2">y</span>);
<span class="keyword-directive">int</span> xTarget1 = (<span class="keyword-directive">new</span> Double(java.lang.Math.<span class="ST3">random</span>() * 240 + 1)).intValue();
<span class="keyword-directive">int</span> yTarget1 = (<span class="keyword-directive">new</span> Double(java.lang.Math.<span class="ST3">random</span>() * 320 + 1)).intValue();
System.<span class="ST4">out</span>.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + xTarget1);
System.<span class="ST4">out</span>.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + yTarget1);
<span class="ST2">timeline</span>.stop();
<span class="ST2">timeline</span>.getKeyFrames().remove(0);
<span class="ST2">timeline</span>.getKeyFrames().add(<span class="ST2">buildKeyFrame</span>.apply(xTarget1, yTarget1));
<span class="ST2">timeline</span>.play();
},
kvx1s, kvy1s);
<span class="keyword-directive">return</span> kf1s;
};
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST1">start</span>(Stage primaryStage) {
<span class="ST2">timeline</span>.setAutoReverse(<span class="keyword-directive">true</span>);
<span class="ST2">timeline</span>.setCycleCount(Timeline.<span class="ST4">INDEFINITE</span>);
<span class="ST2">timeline</span>.getKeyFrames().add(<span class="ST2">buildKeyFrame</span>.apply(0,0));
<span class="ST2">timeline</span>.play();
primaryStage.setTitle(<span class="character">"</span><span class="character">DukeAnim JavaFX 8(b99)</span><span class="character">"</span>);
Image image = <span class="keyword-directive">new</span> Image(DukeAnimJavaFX8Lambda.<span class="keyword-directive">class</span>.getResourceAsStream(<span class="character">"</span><span class="character">images/duke.png</span><span class="character">"</span>));
ImageView imageView = <span class="keyword-directive">new</span> ImageView();
imageView.setImage(image);
Group root = <span class="keyword-directive">new</span> Group();
root.getChildren().add(imageView);
Scene scene = <span class="keyword-directive">new</span> Scene(root,240,320);
imageView.xProperty().bind(<span class="ST2">x</span>);
imageView.yProperty().bind(<span class="ST2">y</span>);
primaryStage.setScene(scene);
primaryStage.show();
}
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST5">main</span>(String[] args) {
<span class="ST3">launch</span>(args);
}
}
</pre>
<br /></div>
<div class="Standard">
<a href="http://pagesperso-orange.fr/paddy.fr/2013/september/ButtonJavaFX8Lambda.zip" style="color: #336699; font-weight: bold;">NetBeans (7.4 Beta) project – Button inJavaFX with Lambda and method references</a><b><span style="color: #336699; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman";"><br><a href="http://pagesperso-orange.fr/paddy.fr/2013/september/DukeAnimJavaFX8.zip">NetBeans (7.4 Beta) project – DukeAnimin JavaFX 8 without builder</a></span></b><b><span style="color: #336699; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman";"><br><a href="http://pagesperso-orange.fr/paddy.fr/2013/september/DukeAnimJavaFX8Lambda1.zip">NetBeans (7.4 Beta) project – DukeAnimin JavaFX 8 with ActionEvent Lambda</a></span></b><b><span style="color: #336699; mso-ansi-language: EN-US; mso-bidi-font-family: "Times New Roman";"><br><a href="http://pagesperso-orange.fr/paddy.fr/2013/september/DukeAnimJavaFX8Lambda2.zip">NetBeans (7.4 Beta) project – DukeAnimin JavaFX 8 with Lambda (ActionEvent + buildKeyFrame)</a></span></b><b><u><br /><br>Related link</u></b></div>
<div class="Standard">
<a href="http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html">http://cr.openjdk.java.net/~briangoetz/lambda/lambda-state-final.html</a><br /><a href="http://cr.openjdk.java.net/~briangoetz/lambda/lambda-libraries-final.html">http://cr.openjdk.java.net/~briangoetz/lambda/lambda-libraries-final.html</a></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-32360634558984304962013-04-18T22:13:00.000+01:002013-04-18T22:13:57.929+01:00Navigation in AngularJS
<div class="Standard">
I continue my exploration of AngularJS, and this time on the navigation part.<br>
To do that, I wrote a little application, to show how to:</div>
<div class="Standard">
</div>
<ul>
<li>use <i><a href="http://docs.angularjs.org/api/ng.$routeProvider">$routeProvider</a></i> to handle the navigation by creating new routes with the necessary parameters to construct the view which will be render by <i><a href="http://docs.angularjs.org/api/ng.directive:ngView">ng-view</a></i>.</li>
<li>navigate from a html link</li>
<li>navigate from a html button</li>
</ul>
<div class="separator" style="clear: both; text-align: center;">
<iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/Ay38DiJUWb4?feature=player_embedded' frameborder='0'></iframe></div>
<div class="Standard">
</div>
<div class="Standard">
<b><u></u></b> <a name='more'></a><b><u>Index.html </u></b><br> index.html is the application entry point.<br> It contains the <i>ng-view</i> attribute, the loading of the controller and a navigation from html links.
<br><br>
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST0 {font-family: Monospaced; font-weight: bold}
.ST2 {font-family: Monospaced; font-weight: bold}
.ST3 {color: #9f0d79}
.ST1 {color: #009900}
.ST4 {color: #0000ff}
.ST5 {color: #007c00; font-family: Monospaced; font-weight: bold}
.string {color: #ce7b00}
.keyword {color: #0000e6}
.sgml-declaration {color: #628fb5}
.argument {color: #009900}
.value {color: #ce7b00}
.tag {color: #0000e6}
-->
</style> <table width="100%">
<tr><td align="center">index.html</td></tr>
</table>
<pre><span class="sgml-declaration"><!doctype</span> <span class="sgml-declaration">html</span><span class="sgml-declaration">></span>
<span class="tag"><</span><span class="tag">html</span> <span class="argument">ng-app</span><span class="argument">=</span><span class="value">"myController"</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">link</span> <span class="argument">rel</span><span class="argument">=</span><span class="value">"stylesheet"</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"</span><span class="value">http://twitter.github.com/bootstrap/assets/css/bootstrap.css</span><span class="value">"</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">script</span> <span class="argument">src</span><span class="argument">=</span><span class="value">"</span><span class="value">http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js</span><span class="value">"</span><span class="tag">></span><span class="tag"></</span><span class="tag">script</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">script</span> <span class="argument">src</span><span class="argument">=</span><span class="value">"./js/controller.js"</span><span class="tag">></span><span class="tag"></</span><span class="tag">script</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">body</span> <span class="tag">></span>
<span class="tag"><</span><span class="tag">h3</span><span class="tag">></span>AngularJS Navigation<span class="tag"></</span><span class="tag">h3</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">br</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">a</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"#/detail"</span><span class="tag">></span>detail<span class="tag"></</span><span class="tag">a</span><span class="tag">></span><span class="ST0">&nbsp;</span>
<span class="tag"><</span><span class="tag">a</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"#/create"</span><span class="tag">></span>create<span class="tag"></</span><span class="tag">a</span><span class="tag">></span><span class="ST0">&nbsp;</span>
<span class="tag"><</span><span class="tag">a</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"#/edit"</span><span class="tag">></span>edit<span class="tag"></</span><span class="tag">a</span><span class="tag">></span><span class="tag"><</span><span class="tag">br</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">ng-view</span><span class="tag">></span><span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">html</span><span class="tag">></span>
</pre>
</div>
<div class="Standard">
<b><u>The controller </u></b><br>The controller defines the <i><a href="http://docs.angularjs.org/api/ng.$routeProvider">$routeProvider</a></i> which describes the navigation rules with routes.<br> The routes are created by using the <i>when</i>'s method which takes a route path and an object as parameters.<br>The object contains the information to make the render the View, in my case, a controller and a template (one of each by route).<br><br><u>For example:</u><br> <span style="font-family: Courier New;"><span style="font-size: 9pt;">$routeProvider.when('/detail', {controller:DetailCtrl, templateUrl:'detail.html'}).</span><span style="font-size: 12px;"> </span></span><br> When the url hash fragment will be <i>/detail</i>, AngularJS will use <i>DetailCtrl</i> as controller and detail.html for rendering by <i><a href="http://docs.angularjs.org/api/ng.directive:ngView">ng-view</a></i>.</div><br>
<div class="Standard">
<table width="100%">
<tr><td align="center">js/controller.js</td></tr>
</table>
<pre><span class="ST3">angular</span>.module(<span class="string">'</span><span class="string">myController</span><span class="string">'</span>,[]).
config(<span class="keyword">function</span>($routeProvider) {
$routeProvider.
when(<span class="string">'</span><span class="string">/detail</span><span class="string">'</span>, {<span class="ST1">controller</span>:DetailCtrl, <span class="ST1">templateUrl</span>:<span class="string">'</span><span class="string">detail.html</span><span class="string">'</span>}).
when(<span class="string">'</span><span class="string">/create</span><span class="string">'</span>, {<span class="ST1">controller</span>:CreateCtrl, <span class="ST1">templateUrl</span>:<span class="string">'</span><span class="string">create.html</span><span class="string">'</span>}).
when(<span class="string">'</span><span class="string">/edit</span><span class="string">'</span>, {<span class="ST1">controller</span>:EditCtrl, <span class="ST1">templateUrl</span>:<span class="string">'</span><span class="string">edit.html</span><span class="string">'</span>}).
when(<span class="string">'</span><span class="string">/next</span><span class="string">'</span>,{<span class="ST1">controller</span>:EditNextCtrl, <span class="ST1">templateUrl</span>:<span class="string">'</span><span class="string">next.html</span><span class="string">'</span>}).
when(<span class="string">'</span><span class="string">/next2</span><span class="string">'</span>,{<span class="ST1">controller</span>:EditNext2Ctrl, <span class="ST1">templateUrl</span>:<span class="string">'</span><span class="string">next2.html</span><span class="string">'</span>}).
otherwise({<span class="ST1">redirectTo</span>:<span class="string">'</span><span class="string">/</span><span class="string">'</span>});
});
<span class="keyword">function</span> <span class="ST2">DetailCtrl</span>($scope) {
<span class="ST3">console</span>.log(<span class="string">"</span><span class="string">detail</span><span class="string">"</span>);
}
<span class="keyword">function</span> <span class="ST2">CreateCtrl</span>($scope) {
<span class="ST3">console</span>.log(<span class="string">"</span><span class="string">create</span><span class="string">"</span>);
}
<span class="keyword">function</span> <span class="ST2">EditCtrl</span>($scope) {
<span class="ST3">console</span>.log(<span class="string">"</span><span class="string">edit</span><span class="string">"</span>);
}
<span class="keyword">function</span> <span class="ST2">EditNextCtrl</span>($scope) {
<span class="ST3">console</span>.log(<span class="string">"</span><span class="string">edit Next</span><span class="string">"</span>);
}
<span class="keyword">function</span> <span class="ST2">EditNext2Ctrl</span>($scope) {
<span class="ST3">console</span>.log(<span class="string">"</span><span class="string">edit Next2</span><span class="string">"</span>);
}
<span class="keyword">function</span> <span class="ST2">DefaultCtrl</span>($scope,$location) {
$scope.<span class="ST2">GoToNext2</span> = <span class="keyword">function</span> (hash) {
<span class="ST3">console</span>.log(<span class="string">"</span><span class="string">go to </span><span class="string">"</span>+hash);
$location.path(hash);
}
}
</pre>
<u><b>The templates and the css</b></u><br>
<br><table width="100%">
<tr><td align="center">edit.html</td></tr>
</table>
<pre><span class="sgml-declaration"><!doctype</span> <span class="sgml-declaration">html</span><span class="sgml-declaration">></span>
<span class="tag"><</span><span class="tag">html</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">link</span> <span class="argument">rel</span><span class="argument">=</span><span class="value">"stylesheet"</span> <span class="argument">type</span><span class="argument">=</span><span class="value">"text/css"</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"css/app.css"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">header</span><span class="value">"</span><span class="tag">></span>
Edit
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">body</span><span class="value">"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">span</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">footer</span><span class="value">"</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">a</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"#/next"</span> <span class="tag">></span>next -> <span class="tag"></</span><span class="tag">a</span><span class="tag">></span><span class="ST2">&nbsp;</span>
<span class="tag"></</span><span class="tag">span</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">html</span><span class="tag">></span>
</pre>
<table width="100%">
<tr><td align="center">next.html</td></tr>
</table>
<pre><span class="sgml-declaration"><!doctype</span> <span class="sgml-declaration">html</span><span class="sgml-declaration">></span>
<span class="tag"><</span><span class="tag">html</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">link</span> <span class="argument">rel</span><span class="argument">=</span><span class="value">"stylesheet"</span> <span class="argument">type</span><span class="argument">=</span><span class="value">"text/css"</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"css/app.css"</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">script</span> <span class="argument">src</span><span class="argument">=</span><span class="value">"./js/controller.js"</span><span class="tag">></span><span class="tag"></</span><span class="tag">script</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">header</span><span class="value">"</span><span class="tag">></span>
Edit Next
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">body</span><span class="value">"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">ng-controller</span><span class="argument">=</span><span class="value">"DefaultCtrl"</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">span</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">footer</span><span class="value">"</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">button</span> <span class="argument">ng-click</span><span class="argument">=</span><span class="value">"GoToNext2('/next2')"</span><span class="tag">></span>next2<span class="tag"></</span><span class="tag">button</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">span</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">html</span><span class="tag">></span>
</pre>
</div>
<div class="Standard">
To navigate from a button, I used the <i>$location.path()</i> method.<br> The <i>$location.path</i> method is called in the <i>GoToNext2</i> function which is itself declared in <i>DefaultCtrl</i> controller.<br> For more information on <a href="http://docs.angularjs.org/api/ng.$location"><i>$location</i></a> you can read <a href="http://docs.angularjs.org/guide/dev_guide.services.$location">this guide</a>.<br>
<table width="100%">
<tr><td align="center">next2.html</td></tr>
</table>
<pre><span class="sgml-declaration"><!doctype</span> <span class="sgml-declaration">html</span><span class="sgml-declaration">></span>
<span class="tag"><</span><span class="tag">html</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">link</span> <span class="argument">rel</span><span class="argument">=</span><span class="value">"stylesheet"</span> <span class="argument">type</span><span class="argument">=</span><span class="value">"text/css"</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"css/app.css"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">header</span><span class="value">"</span><span class="tag">></span>
Edit Next 2
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">body</span><span class="value">"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">html</span><span class="tag">></span>
</pre>
<table width="100%">
<tr><td align="center">create.html</td></tr>
</table>
<pre><span class="sgml-declaration"><!doctype</span> <span class="sgml-declaration">html</span><span class="sgml-declaration">></span>
<span class="tag"><</span><span class="tag">html</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">link</span> <span class="argument">rel</span><span class="argument">=</span><span class="value">"stylesheet"</span> <span class="argument">type</span><span class="argument">=</span><span class="value">"text/css"</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"css/app.css"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">header</span><span class="value">"</span><span class="tag">></span>
Create
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">body</span><span class="value">"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">html</span><span class="tag">></span>
</pre>
<table width="100%">
<tr><td align="center">detail.html</td></tr>
</table>
<pre><span class="sgml-declaration"><!doctype</span> <span class="sgml-declaration">html</span><span class="sgml-declaration">></span>
<span class="tag"><</span><span class="tag">html</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">link</span> <span class="argument">rel</span><span class="argument">=</span><span class="value">"stylesheet"</span> <span class="argument">type</span><span class="argument">=</span><span class="value">"text/css"</span> <span class="argument">href</span><span class="argument">=</span><span class="value">"css/app.css"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">header</span><span class="value">"</span><span class="tag">></span>
Detail
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">div</span> <span class="argument">class</span><span class="argument">=</span><span class="value">"</span><span class="ST5">body</span><span class="value">"</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">div</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">html</span><span class="tag">></span>
</pre>
<table width="100%">
<tr><td align="center">css/app.css</td></tr>
</table>
<pre><span class="ST5">.</span><span class="ST5">header</span> {
<span class="ST4">background-color</span>:#EEE;
}
<span class="ST5">.</span><span class="ST5">body</span> {
<span class="ST4">border</span>: 1px solid black;
<span class="ST4">height</span>: 300px;
<span class="ST4">background-color</span>: white;
}
<span class="ST5">.</span><span class="ST5">footer</span> {
<span class="ST4">float</span>: right;
}
</pre>
<u><b>Run this example</b></u><b> <u> </u></b><br>To run this example, I needed a web server because <i>ng-view</i> uses <a href="http://en.wikipedia.org/wiki/XMLHttpRequest">XHR</a> to load the html pages.<br> I therefore used node.js with <a href="http://stackoverflow.com/questions/6084360/node-js-as-a-simple-web-server">this script</a> as web server. <br><br> <u>1-Launch the server </u><br> $ node webServer.js</div><br>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://4.bp.blogspot.com/-8qLCzdzli7M/UXAqey3ANKI/AAAAAAAAANo/N5sPGgtR4UQ/s1600/node.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="115" src="http://4.bp.blogspot.com/-8qLCzdzli7M/UXAqey3ANKI/AAAAAAAAANo/N5sPGgtR4UQ/s400/node.png" width="400" /></a> </div>
<div class="Standard">
<u>2-Execute the application</u><br> <span style="color: windowtext;"> http://localhost:8888/index.html</span><br><br> <u>3-Then navigate...</u></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://2.bp.blogspot.com/-UGhYVSGjoK4/UXAqe6JqmaI/AAAAAAAAANo/hJVi7_e8l1Q/s1600/navigate.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="342" src="http://2.bp.blogspot.com/-UGhYVSGjoK4/UXAqe6JqmaI/AAAAAAAAANo/hJVi7_e8l1Q/s400/navigate.png" width="400" /></a></div>
<div class="Standard">
<br>
<b><a href="http://pagesperso-orange.fr/paddy.fr/2013/april/Navigation.zip">AngularJS Example with the node.js script</a></b><br><br> <b> <u>Related link</u></b><br> <span style="color: windowtext; text-decoration: none; text-underline: none;"><b> <a href="http://www.itaware.eu/2012/10/19/angularjs-routes-and-navigation/">http://www.itaware.eu/2012/10/19/angularjs-routes-and-navigation/</a></b></span></div>
Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-7060876157689063902013-02-15T23:09:00.000+01:002013-02-15T23:09:04.066+01:00Consume a RESTful service with AngularJS<br />
<div class="MsoNormal" style="background: white; mso-background-themecolor: background1;">In the beginning of this year, I watched the <a href="http://www.parleys.com/#st=5&id=3508&sl=0">AngularJS's talk at Devoxx onParleys</a>. After that, I went to <a href="http://www.parisjug.org/xwiki/bin/view/Meeting/20130108">ParisJUG</a> to see the technical talk about AngularJS. <br />
And I thought: it seems to be a great JavaScript framework, I must try it!<br />
To try it, I wrote a small application which consume a REST service.<br />
The application is similar to the application I wrote for the post: <a href="http://paddyweblog.blogspot.fr/2012/09/put-it-all-together-javafx-2x-custom.html">put it alltogether</a>, and consumes the same <a href="http://paddyweblog.blogspot.fr/2010/07/restful-service-with-jax-rs-and-jpa-2.html">REST service</a>.</div><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/GqWoCGzUfWU?feature=player_embedded' frameborder='0'></iframe></div><div class="MsoNormal" style="background: white; mso-background-themecolor: background1;"></div><a name='more'></a><b><u>1 - Call a REST service in AngularJS.</u></b><br>
<b> </b>Normally in AngularJS if you want to call a REST service, you have to write something like this:<br>
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST0 {color: #628fb5}
.ST3 {color: #007c00; background-color: #e3f2e1; font-family: Monospaced; font-weight: bold}
.scriptlet-delimiter {background-color: #e3f2e1}
.ST2 {color: #009900}
.attribute-value {color: #ce7b00}
.ST1 {color: #0000e6}
.character {color: #ce7b00}
.keyword-directive {color: #0000e6}
.ST4 {font-family: Monospaced; font-weight: bold}
.ST5 {color: #ce7b00; font-family: Monospaced; font-weight: bold}
.ST6 {color: #009900}
.STRING_LITERAL {color: #ce7b00}
.keyword {color: #0000e6}
.highlight-caret-row {background-color: #e9eff8}
.LINE_COMMENT {color: #969696}
.ST7 {color: #0000e6; background-color: #e9eff8}
.ST8 {color: #ce7b00; background-color: #e9eff8}
.ST9 {color: #009900; background-color: #e9eff8}
.xml-attribute {color: #009900}
.xml-value {color: #ce7b00}
.xml-tag {color: #0000e6}
.ST10 {color: #00007c; font-family: Monospaced; font-weight: bold}
-->
</style>
<pre><span class="ST6">angular</span>.module(<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">myModule</span><span class="STRING_LITERAL">'</span>, [<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">ngResource</span><span class="STRING_LITERAL">'</span>], <span class="keyword">function</span>($provide) {
$provide.factory(<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">musics</span><span class="STRING_LITERAL">'</span>, [<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">$resource</span><span class="STRING_LITERAL">'</span>, <span class="keyword">function</span>($resource) {
<span class="keyword">return</span> {
<span class="ST4">getArtistBeginBy</span>: <span class="keyword">function</span>(beginByP) {
<span class="keyword">return</span> $resource(<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">http://localhost</span><span class="ST5">\\</span><span class="STRING_LITERAL">:8080/RESTfulServices/rs/ArtisteNameBeginningBy/:beginBy</span><span class="STRING_LITERAL">'</span>).get(
{
beginBy: beginByP
}
);
}
}
}]);
});
<span class="keyword">function</span> <span class="ST4">SearchCtrl</span>($scope, $resource, musics) {
$scope.search = <span class="keyword">function</span>() {
$scope.listMusic = musics.getArtistBeginBy($scope.yourSearch);
}
}
</pre>But because, my REST service uses JAXB as JSON serializer, I have an issue when I have "<a href="http://stackoverflow.com/questions/5641430/jaxb-single-element-in-array">a single element inarray</a>".<br>
My service returns something like this:<br>
<span style="font-family: "Courier New"; font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: "Arial Unicode MS";">{"music":{"albumTitle":"A tout moment","artisteName":"Eiffel","id":"14"}}</span><br>
Instead of:<br>
<span style="font-family: "Courier New"; font-size: 10.0pt; line-height: 115%; mso-bidi-font-family: "Arial Unicode MS";">{"music":<b><span style="color: red;">[</span></b>{"albumTitle":"A tout moment","artisteName":"Eiffel","id":"14"}<b><span style="color: #c00000;">]</span></b>}</span><br>
And ng-repeat of AngularJS don't like that ;)<br>
<br>
To work around this issue, I alter the data returned by $resource.<br>
When the data returned by $resource are not empty (not undefined) and are not an array, I'm in case of "a single element in array", then:
<div class="MsoNormal" style="background: white; mso-background-themecolor: background1;"></div><ul><li>I create an array</li>
<li>I put the data returned by $resource (single element) in the array</li>
<li>and I replace the data returned by $resource by the array </li>
</ul>The code to call the REST service with the workaround:<br>
<table width="100%"><tr><td align="center">js/search.js</td></tr></table><pre><span class="STRING_LITERAL">angular</span><span class="STRING_LITERAL">.</span><span class="STRING_LITERAL">module</span><span class="STRING_LITERAL">(</span><span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">myModule</span><span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">,</span> <span class="STRING_LITERAL">[</span><span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">ngResource</span><span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">]</span><span class="STRING_LITERAL">,</span> <span class="STRING_LITERAL">function</span><span class="STRING_LITERAL">(</span><span class="STRING_LITERAL">$provide</span><span class="STRING_LITERAL">)</span> <span class="STRING_LITERAL">{</span>
$provide.factory(<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">musics</span><span class="STRING_LITERAL">'</span>, [<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">$resource</span><span class="STRING_LITERAL">'</span>, <span class="keyword">function</span>($resource) {
<span class="keyword">return</span> {
<span class="ST4">getArtistBeginBy</span>: <span class="keyword">function</span>(beginByP) {
<span class="keyword">return</span> $resource(<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">http://localhost</span><span class="ST5">\\</span><span class="STRING_LITERAL">:8080/RESTfulServices/rs/ArtisteNameBeginningBy/:beginBy</span><span class="STRING_LITERAL">'</span>).get(
{
beginBy: beginByP
} , <span class="LINE_COMMENT">//</span><span class="LINE_COMMENT">params</span>
<span class="keyword">function</span> (data) { <span class="LINE_COMMENT">//</span><span class="LINE_COMMENT">success</span>
<span class="keyword">if</span> (! (data[<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">music</span><span class="STRING_LITERAL">'</span>] <span class="keyword">instanceof</span> Array)){
<span class="keyword">if</span> (<span class="keyword">typeof</span> data[<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">music</span><span class="STRING_LITERAL">'</span>] != <span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">undefined</span><span class="STRING_LITERAL">'</span>){
<span class="keyword">var</span> myArray = <span class="keyword">new</span> Array();
myArray.push(data[<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">music</span><span class="STRING_LITERAL">'</span>]);
data[<span class="STRING_LITERAL">'</span><span class="STRING_LITERAL">music</span><span class="STRING_LITERAL">'</span>] = myArray;
}
}
},
<span class="keyword">function</span> (data) { <span class="LINE_COMMENT">//</span><span class="LINE_COMMENT">failure</span>
<span class="LINE_COMMENT">//</span><span class="LINE_COMMENT">error</span> <span class="LINE_COMMENT">handling</span> <span class="LINE_COMMENT">goes</span> <span class="LINE_COMMENT">here</span>
}
);
}
}
}]);
});
<span class="keyword">function</span> <span class="ST4">SearchCtrl</span>($scope, $resource, musics) {
$scope.search = <span class="keyword">function</span>() {
$scope.listMusic = musics.getArtistBeginBy($scope.yourSearch);
}
}
</pre><b><u>2 - Use the service and bind the result in the html page.</u></b><br>
<table width="100%"><tr><td align="center">index.html</td></tr></table><pre>
<span class="ST0"><!doctype</span> <span class="ST0">html</span><span class="ST0">></span>
<span class="ST1"><</span><span class="ST1">html</span> <span class="ST2">ng-app</span><span class="ST2">=</span><span class="attribute-value">"myModule"</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">head</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">link</span> <span class="ST2">rel</span><span class="ST2">=</span><span class="attribute-value">"stylesheet"</span> <span class="ST2">href</span><span class="ST2">=</span><span class="attribute-value">"</span><span class="attribute-value">http://twitter.github.com/bootstrap/assets/css/bootstrap.css</span><span class="attribute-value">"</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">script</span> <span class="ST2">src</span><span class="ST2">=</span><span class="attribute-value">"</span><span class="attribute-value">http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular.js</span><span class="attribute-value">"</span><span class="ST1">></span><span class="ST1"></</span><span class="ST1">script</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">script</span> <span class="ST2">src</span><span class="ST2">=</span><span class="attribute-value">"</span><span class="attribute-value">http://ajax.googleapis.com/ajax/libs/angularjs/1.0.4/angular-resource.js</span><span class="attribute-value">"</span><span class="ST1">></span><span class="ST1"></</span><span class="ST1">script</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">script</span> <span class="ST2">src</span><span class="ST2">=</span><span class="attribute-value">"./js/search.js"</span><span class="ST1">></span><span class="ST1"></</span><span class="ST1">script</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">head</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">body</span> <span class="ST2">ng-controller</span><span class="ST2">=</span><span class="attribute-value">"SearchCtrl"</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">div</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">br</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">input</span> <span class="ST2">type</span><span class="ST2">=</span><span class="attribute-value">"text"</span> <span class="ST2">ng-model</span><span class="ST2">=</span><span class="attribute-value">"yourSearch"</span> <span class="ST2">class</span><span class="ST2">=</span><span class="attribute-value">"</span><span class="ST3">search-query</span><span class="attribute-value">"</span> <span class="ST2">placeholder</span><span class="ST2">=</span><span class="attribute-value">"Enter an artist name here"</span> <span class="ST2">ng-change</span><span class="ST2">=</span><span class="attribute-value">"search()"</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">hr</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">table</span> <span class="ST2">border</span><span class="ST2">=</span><span class="attribute-value">"1"</span> <span class="ST2">class</span><span class="ST2">=</span><span class="attribute-value">"</span><span class="ST3">table</span> <span class="ST3">table-striped</span><span class="attribute-value">"</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">thead</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">tr</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">th</span><span class="ST1">></span>ID<span class="ST1"></</span><span class="ST1">th</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">th</span><span class="ST1">></span>Artist Name<span class="ST1"></</span><span class="ST1">th</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">th</span><span class="ST1">></span>Album Name<span class="ST1"></</span><span class="ST1">th</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">tr</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">thead</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">tbody</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">tr</span> <span class="ST2">ng-repeat</span><span class="ST2">=</span><span class="attribute-value">"m in listMusic.music"</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">td</span><span class="ST1">></span>{{m.id}}<span class="ST1"></</span><span class="ST1">td</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">td</span><span class="ST1">></span>{{m.artisteName}}<span class="ST1"></</span><span class="ST1">td</span><span class="ST1">></span>
<span class="ST1"><</span><span class="ST1">td</span><span class="ST1">></span>{{m.albumTitle}}<span class="ST1"></</span><span class="ST1">td</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">tr</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">tbody</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">table</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">div</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">body</span><span class="ST1">></span>
<span class="ST1"></</span><span class="ST1">html</span><span class="ST1">></span>
</pre><b><u>3 - Add Cross-origine resource sharing <a href="http://en.wikipedia.org/wiki/Cross-origin_resource_sharing">(CORS)</a> to Jersey REST services</u></b><br>
And finally, because I want to call my REST service from any domain, I add <a href="http://www.w3.org/TR/cors/">CORS</a> to Jersey REST Service.<br>
Now, I can have a standalone Angularjs's application (outside the web application).<br>
To do that, I add a filter to the Jersey servlet.<br>
<br>
<u>The filter</u><br>
<table width="100%"><tr><td align="center">ResponseCorsFilter.java</td></tr></table><pre><span class="keyword-directive">package</span> paddy.jersey.cors;
<span class="keyword-directive">import</span> com.sun.jersey.spi.container.ContainerRequest;
<span class="keyword-directive">import</span> com.sun.jersey.spi.container.ContainerResponse;
<span class="keyword-directive">import</span> com.sun.jersey.spi.container.ContainerResponseFilter;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST4">ResponseCorsFilter</span> <span class="keyword-directive">implements</span> ContainerResponseFilter {
@Override
<span class="keyword-directive">public</span> ContainerResponse <span class="ST4">filter</span>(ContainerRequest req, ContainerResponse contResp) {
contResp.getHttpHeaders().putSingle(<span class="character">"</span><span class="character">Access-Control-Allow-Origin</span><span class="character">"</span>, <span class="character">"</span><span class="character">*</span><span class="character">"</span>);
contResp.getHttpHeaders().putSingle(<span class="character">"</span><span class="character">Access-Control-Allow-Methods</span><span class="character">"</span>, <span class="character">"</span><span class="character">GET, POST, OPTIONS</span><span class="character">"</span>);
String reqHead = req.getHeaderValue(<span class="character">"</span><span class="character">Access-Control-Request-Headers</span><span class="character">"</span>);
contResp.getHttpHeaders().putSingle(<span class="character">"</span><span class="character">Access-Control-Allow-Headers</span><span class="character">"</span>, reqHead);
<span class="keyword-directive">return</span> contResp;
}
}
</pre><u>Filter declaration</u><br>
<table width="100%"><tr><td align="center">web.xml</td></tr></table><pre><span class="ST10"><?</span><span class="ST10">xml</span> version="1.0" encoding="UTF-8"?>
<span class="xml-tag"><web-app</span> <span class="xml-attribute">version</span>=<span class="xml-value">"3.0"</span> <span class="xml-attribute">xmlns</span>=<span class="xml-value">"</span><span class="xml-value">http://java.sun.com/xml/ns/javaee</span><span class="xml-value">"</span> <span class="xml-attribute">xmlns:xsi</span>=<span class="xml-value">"</span><span class="xml-value">http://www.w3.org/2001/XMLSchema-instance</span><span class="xml-value">"</span> <span class="xml-attribute">xsi:schemaLocation</span>=<span class="xml-value">"</span><span class="xml-value">http://java.sun.com/xml/ns/javaee</span> <span class="xml-value">http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd</span><span class="xml-value">"</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-name</span><span class="xml-tag">></span>ServletAdaptor<span class="xml-tag"></servlet-name</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-class</span><span class="xml-tag">></span>com.sun.jersey.spi.container.servlet.ServletContainer<span class="xml-tag"></servlet-class</span><span class="xml-tag">></span>
<span class="xml-tag"><init-param</span><span class="xml-tag">></span>
<span class="xml-tag"><param-name</span><span class="xml-tag">></span>com.sun.jersey.spi.container.ContainerResponseFilters<span class="xml-tag"></param-name</span><span class="xml-tag">></span>
<span class="xml-tag"><param-value</span><span class="xml-tag">></span>paddy.jersey.cors.ResponseCorsFilter<span class="xml-tag"></param-value</span><span class="xml-tag">></span>
<span class="xml-tag"></init-param</span><span class="xml-tag">></span>
<span class="xml-tag"><load-on-startup</span><span class="xml-tag">></span>1<span class="xml-tag"></load-on-startup</span><span class="xml-tag">></span>
<span class="xml-tag"></servlet</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-mapping</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-name</span><span class="xml-tag">></span>ServletAdaptor<span class="xml-tag"></servlet-name</span><span class="xml-tag">></span>
<span class="xml-tag"><url-pattern</span><span class="xml-tag">></span>/rs/*<span class="xml-tag"></url-pattern</span><span class="xml-tag">></span>
<span class="xml-tag"></servlet-mapping</span><span class="xml-tag">></span>
<span class="xml-tag"><session-config</span><span class="xml-tag">></span>
<span class="xml-tag"><session-timeout</span><span class="xml-tag">></span>
30
<span class="xml-tag"></session-timeout</span><span class="xml-tag">></span>
<span class="xml-tag"></session-config</span><span class="xml-tag">></span>
<span class="xml-tag"></web-app</span><span class="xml-tag">></span>
</pre><br>
<b><a href="http://pagesperso-orange.fr/paddy.fr/2013/february/Search.zip">AngularJS standalone source code</a></b><br><br>
<b><a href="http://pagesperso-orange.fr/paddy.fr/2013/february/RESTfulServices.zip">NetBeans project of the service with CORS</a><o:p></o:p></b><br> Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-62614249974775847452012-09-27T17:21:00.001+01:002012-09-28T22:01:06.249+01:00Put it all together (JavaFX 2.x Custom component, FXML, JAX-RS 2.0 client API)In my last post, I wrote about how to <a href="http://paddyweblog.blogspot.fr/2012/06/custom-component-compatible-with-fxml.html">make custom component compatible with FXML</a> and how to use it in an application.<br />
Before that, I had tested the client API of JAX-RS 2.0 (with <a href="http://paddyweblog.blogspot.fr/2012/05/restful-client-in-java-with-jax-rs-20_23.html">JSON</a> and <a href="http://paddyweblog.blogspot.fr/2012/05/restful-client-in-java-with-jax-rs-20.html">XML serialization</a>).<br />
And now, when I’m putting them together, I can write a small JavaFX 2 application which consumes REST services.<br />
<br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/SnZIzQ0BM84?feature=player_embedded' frameborder='0'></iframe></div><div class="MsoNormal"></div><div class="MsoNormal"><b></b></div><a name='more'></a><b>1. The REST service</b><br>
For the REST service, I have used the same service that I used for <a href="http://paddyweblog.blogspot.fr/2012/05/restful-client-in-java-with-jax-rs-20.html">try the JAX-RS 2.0 client API</a>.<br><br>
<b>2. The JAX-RS 2.0 client API</b><br>
For the JAX-RS 2.0 client API, I have upgraded to Jersey 2.0-m07.<br>
This version fixes the <a href="http://java.net/jira/browse/JERSEY-1143">JERSEY-1143 issue</a> and changes the way to declare JSON implementation. <div><br>
<u> </u> <u>The XML version </u>
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST1 {font-family: Monospaced; font-style: italic}
.ST0 {font-family: Monospaced; font-weight: bold}
.character {color: #ce7b00}
.ST2 {color: #009900; font-family: Monospaced; font-style: italic}
.ST10 {color: #00007c; font-family: Monospaced; font-weight: bold}
.keyword-directive {color: #0000e6}
.xml-attribute {color: #009900}
.xml-value {color: #ce7b00}
.xml-tag {color: #0000e6}
.comment {color: #969696}
.ST22 {font-family: Monospaced; font-style: italic}
.ST20 {font-family: Monospaced; font-weight: bold}
.ST21 {color: #009900}
.ST23 {color: #009900; font-family: Monospaced; font-style: italic}
.ST31 {font-family: Monospaced; font-weight: bold; font-style: italic}
.ST32 {font-family: Monospaced; font-style: italic}
.ST30 {font-family: Monospaced; font-weight: bold}
-->
</style> <pre><span class="keyword-directive">protected</span> List<Music> <span class="ST0">findArtistByName</span>(String artistBeginBy){
Client client = ClientFactory.<span class="ST1">newClient</span>();
GenericType<List<Music>> listm = <span class="keyword-directive">new</span> GenericType<List<Music>>() {};
List<Music> listMusic = client.target(<span class="character">"</span><span class="character">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="character">{beginBy}</span><span class="character">"</span>)
.pathParam(<span class="character">"</span><span class="character">beginBy</span><span class="character">"</span>, artistBeginBy)
.request(MediaType.<span class="ST2">APPLICATION_XML</span>)
.get(listm);
<span class="keyword-directive">return</span> listMusic;
}
</pre></div><div><u>The JSON version</u><br>
For the JSON version of the client, I have used Jackson implementation. <pre><span class="keyword-directive">protected</span> List<Music> <span class="ST0">findArtistByName</span>(String artistBeginBy){
Client client = ClientFactory.<span class="ST1">newClient</span>();
client.configuration().register(<span class="keyword-directive">new</span> JacksonFeature());
ListMusic listMusic = client.target(<span class="character">"</span><span class="character">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="character">{beginBy}</span><span class="character">"</span>)
.pathParam(<span class="character">"</span><span class="character">beginBy</span><span class="character">"</span>, artistBeginBy)
.request(MediaType.<span class="ST2">APPLICATION_JSON</span>)
.get(ListMusic.<span class="keyword-directive">class</span>);
<span class="keyword-directive">if</span> (listMusic==<span class="keyword-directive">null</span>){
listMusic = <span class="keyword-directive">new</span> ListMusic();
}
<span class="keyword-directive">return</span> listMusic.getMusic();
}
</pre><b> </b></div><div><b> </b> <b>3. The application</b>
<div class="MsoNormal">The application is based on the application that I wrote to show how to use a custom component with FXML.<br> I just have added one Table control to show the result of the query and called the REST service in handleSearchTextBoxSearchEvent method of the controller to fill the Table control.
<br><br>
<u>The UI</u><br><br>
<table width="100%"><tr><td align="center">Screen1.fxml</td></tr>
</table><pre><span class="ST10"><?</span><span class="ST10">xml</span> version="1.0" encoding="UTF-8"?>
<span class="ST10"><?</span><span class="ST10">import</span> java.lang.*?>
<span class="ST10"><?</span><span class="ST10">import</span> java.util.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.collections.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.scene.control.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.scene.control.cell.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.scene.layout.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.scene.paint.*?>
<span class="ST10"><?</span><span class="ST10">import</span> com.paddyweblog.control.*?>
<span class="xml-tag"><VBox</span> <span class="xml-attribute">id</span>=<span class="xml-value">"vBox1"</span>
<span class="xml-attribute">prefWidth</span>=<span class="xml-value">"600.0"</span>
<span class="xml-attribute">spacing</span>=<span class="xml-value">"10.0"</span>
<span class="xml-attribute">xmlns:fx</span>=<span class="xml-value">"</span><span class="xml-value">http://javafx.com/fxml</span><span class="xml-value">"</span>
<span class="xml-attribute">fx:controller</span>=<span class="xml-value">"putItAllTogether.Screen1"</span><span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><HBox</span> <span class="xml-attribute">id</span>=<span class="xml-value">"hBox1"</span> <span class="xml-attribute">alignment</span>=<span class="xml-value">"CENTER"</span> <span class="xml-attribute">spacing</span>=<span class="xml-value">"10.0"</span> <span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><Label</span> <span class="xml-attribute">id</span>=<span class="xml-value">"label1"</span> <span class="xml-attribute">contentDisplay</span>=<span class="xml-value">"CENTER"</span> <span class="xml-attribute">text</span>=<span class="xml-value">"Size font Text Search Text Box"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><ComboBox</span> <span class="xml-attribute">id</span>=<span class="xml-value">"comboBox1"</span> <span class="xml-attribute">fx:id</span>=<span class="xml-value">"comboBox1"</span> <span class="xml-attribute">onAction</span>=<span class="xml-value">"#handleComboBoxAction"</span> <span class="xml-tag">></span>
<span class="xml-tag"><items</span><span class="xml-tag">></span>
<span class="xml-tag"><FXCollections</span> <span class="xml-attribute">fx:factory</span>=<span class="xml-value">"observableArrayList"</span><span class="xml-tag">></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"10"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"13"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"15"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"20"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"25"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"30"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"35"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"40"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"45"</span> <span class="xml-tag">/></span>
<span class="xml-tag"></FXCollections</span><span class="xml-tag">></span>
<span class="xml-tag"></items</span><span class="xml-tag">></span>
<span class="xml-tag"></ComboBox</span><span class="xml-tag">></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"></HBox</span><span class="xml-tag">></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><SearchTextBox</span> <span class="xml-attribute">fx:id</span>=<span class="xml-value">"searchTextBox1"</span>
<span class="xml-attribute">onCrossButtonMouseClicked</span>=<span class="xml-value">"#handleSearchTextBoxCrossButtonOnMouseClicked"</span>
<span class="xml-attribute">onSearchEvent</span>=<span class="xml-value">"#handleSearchTextBoxSearchEvent"</span><span class="xml-tag">></span>
<span class="xml-tag"></SearchTextBox</span><span class="xml-tag">></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><TableView</span> <span class="xml-attribute">fx:id</span>=<span class="xml-value">"tableView"</span> <span class="xml-tag">></span>
<span class="xml-tag"><columns</span><span class="xml-tag">></span>
<span class="xml-tag"><TableColumn</span> <span class="xml-attribute">text</span>=<span class="xml-value">"ID"</span> <span class="xml-attribute">prefWidth</span>=<span class="xml-value">"49"</span><span class="xml-tag">></span>
<span class="xml-tag"><cellValueFactory</span><span class="xml-tag">></span><span class="xml-tag"><PropertyValueFactory</span> <span class="xml-attribute">property</span>=<span class="xml-value">"id"</span> <span class="xml-tag">/></span>
<span class="xml-tag"></cellValueFactory</span><span class="xml-tag">></span>
<span class="xml-tag"></TableColumn</span><span class="xml-tag">></span>
<span class="xml-tag"><TableColumn</span> <span class="xml-attribute">text</span>=<span class="xml-value">"Artist Name"</span> <span class="xml-attribute">prefWidth</span>=<span class="xml-value">"149"</span><span class="xml-tag">></span>
<span class="xml-tag"><cellValueFactory</span><span class="xml-tag">></span><span class="xml-tag"><PropertyValueFactory</span> <span class="xml-attribute">property</span>=<span class="xml-value">"artisteName"</span> <span class="xml-tag">/></span>
<span class="xml-tag"></cellValueFactory</span><span class="xml-tag">></span>
<span class="xml-tag"></TableColumn</span><span class="xml-tag">></span>
<span class="xml-tag"><TableColumn</span> <span class="xml-attribute">text</span>=<span class="xml-value">"Album Name"</span> <span class="xml-attribute">prefWidth</span>=<span class="xml-value">"400"</span><span class="xml-tag">></span>
<span class="xml-tag"><cellValueFactory</span><span class="xml-tag">></span><span class="xml-tag"><PropertyValueFactory</span> <span class="xml-attribute">property</span>=<span class="xml-value">"albumTitle"</span> <span class="xml-tag">/></span>
<span class="xml-tag"></cellValueFactory</span><span class="xml-tag">></span>
<span class="xml-tag"></TableColumn</span><span class="xml-tag">></span>
<span class="xml-tag"></columns</span><span class="xml-tag">></span>
<span class="xml-tag"></TableView</span><span class="xml-tag">></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"></VBox</span><span class="xml-tag">></span>
</pre><u>The Controller</u><br><br>
<table width="100%"><tr><td align="center">Screen1.java</td></tr>
</table><pre><span class="keyword-directive">package</span> putItAllTogether;
<span class="keyword-directive">import</span> com.paddyweblog.control.SearchTextBox;
<span class="keyword-directive">import</span> com.paddyweblog.control.SearchTextBoxEvent;
<span class="keyword-directive">import</span> java.net.URL;
<span class="keyword-directive">import</span> java.util.List;
<span class="keyword-directive">import</span> java.util.ResourceBundle;
<span class="keyword-directive">import</span> javafx.collections.ObservableList;
<span class="keyword-directive">import</span> javafx.event.ActionEvent;
<span class="keyword-directive">import</span> javafx.fxml.FXML;
<span class="keyword-directive">import</span> javafx.fxml.Initializable;
<span class="keyword-directive">import</span> javafx.scene.control.ComboBox;
<span class="keyword-directive">import</span> javafx.scene.control.TableView;
<span class="keyword-directive">import</span> javafx.scene.input.MouseEvent;
<span class="keyword-directive">import</span> javafx.scene.text.Font;
<span class="keyword-directive">import</span> javax.ws.rs.client.Client;
<span class="keyword-directive">import</span> javax.ws.rs.core.GenericType;
<span class="keyword-directive">import</span> javax.ws.rs.core.MediaType;
<span class="keyword-directive">import</span> javax.ws.rs.client.ClientFactory;
<span class="keyword-directive">import</span> org.glassfish.jersey.jackson.JacksonFeature;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST20">Screen1</span> <span class="keyword-directive">implements</span> Initializable {
@FXML <span class="keyword-directive">private</span> TableView<Music> <span class="ST21">tableView</span>;
@FXML
<span class="keyword-directive">private</span> ComboBox <span class="ST21">comboBox1</span>;
@FXML
<span class="keyword-directive">private</span> SearchTextBox <span class="ST21">searchTextBox1</span>;
@FXML
<span class="keyword-directive">private</span> <span class="keyword-directive">void</span> <span class="ST20">handleComboBoxAction</span>(ActionEvent event) {
Font f = <span class="ST21">searchTextBox1</span>.getFont();
String name = f.getName();
<span class="keyword-directive">double</span> sizeValue = Double.<span class="ST22">parseDouble</span>((String)<span class="ST21">comboBox1</span>.getValue());
Font fnew = <span class="keyword-directive">new</span> Font(name,sizeValue);
<span class="ST21">searchTextBox1</span>.setFont(fnew);
}
@FXML
<span class="keyword-directive">private</span> <span class="keyword-directive">void</span> <span class="ST20">handleSearchTextBoxCrossButtonOnMouseClicked</span>(MouseEvent mouseEvent){
System.<span class="ST23">out</span>.println(<span class="character">"</span><span class="character">handleSearchTextBoxCrossButtonOnMouseClicked</span><span class="character">"</span>);
ObservableList<Music> data = <span class="ST21">tableView</span>.getItems();
data.clear();
}
@FXML
<span class="keyword-directive">private</span> <span class="keyword-directive">void</span> <span class="ST20">handleSearchTextBoxSearchEvent</span>(SearchTextBoxEvent searchTextBoxEvent){
System.<span class="ST23">out</span>.println(<span class="character">"</span><span class="character">handleSearchTextBoxSearchEvent</span><span class="character">"</span>+searchTextBoxEvent.getText());
ObservableList<Music> data = <span class="ST21">tableView</span>.getItems();
data.clear();
<span class="keyword-directive">if</span> (searchTextBoxEvent.getText().length()>0){
List<Music> listMusic = <span class="keyword-directive">this</span>.findArtistByName(searchTextBoxEvent.getText());
System.<span class="ST23">out</span>.println(<span class="character">"</span><span class="character">listMusic : </span><span class="character">"</span>+listMusic);
<span class="keyword-directive">for</span> (Music music :listMusic){
data.add(music);
}
}
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST20">initialize</span>(URL url, ResourceBundle rb) {
Font f = <span class="ST21">searchTextBox1</span>.getFont();
<span class="ST21">comboBox1</span>.setValue(String.<span class="ST22">valueOf</span>((<span class="keyword-directive">int</span>)f.getSize()));
}
<span class="keyword-directive">protected</span> List<Music> <span class="ST20">findArtistByName</span>(String artistBeginBy){
Client client = ClientFactory.<span class="ST22">newClient</span>();
GenericType<List<Music>> listm = <span class="keyword-directive">new</span> GenericType<List<Music>>() {};
List<Music> listMusic = client.target(<span class="character">"</span><span class="character">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="character">{beginBy}</span><span class="character">"</span>)
.pathParam(<span class="character">"</span><span class="character">beginBy</span><span class="character">"</span>, artistBeginBy)
.request(MediaType.<span class="ST23">APPLICATION_XML</span>)
.get(listm);
<span class="keyword-directive">return</span> listMusic;
}
<span class="comment">/* </span>
<span class="comment"> protected List<Music> findArtistByName(String artistBeginBy){</span>
<span class="comment"> Client client = ClientFactory.newClient();</span>
<span class="comment"> client.configuration().register(new JacksonFeature()); </span>
<span class="comment"> ListMusic listMusic = client.target("</span><span class="comment">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="comment">{beginBy}")</span>
<span class="comment"> .pathParam("beginBy", artistBeginBy)</span>
<span class="comment"> .request(MediaType.APPLICATION_JSON)</span>
<span class="comment"> .get(ListMusic.class); </span>
<span class="comment"> if (listMusic==null){</span>
<span class="comment"> listMusic = new ListMusic();</span>
<span class="comment"> }</span>
<span class="comment"> return listMusic.getMusic();</span>
<span class="comment"> } </span>
<span class="comment"> */</span>
}
</pre><u>The JavaFX application</u><br><br>
<table width="100%"><tr><td align="center">PutItAllTogether.java</td></tr>
</table><pre><span class="keyword-directive">package</span> putItAllTogether;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> javafx.fxml.FXMLLoader;
<span class="keyword-directive">import</span> javafx.scene.Parent;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST30">PutItAllTogether</span> <span class="keyword-directive">extends</span> Application {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST31">main</span>(String[] args) {
Application.<span class="ST32">launch</span>(PutItAllTogether.<span class="keyword-directive">class</span>, args);
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST30">start</span>(Stage stage) <span class="keyword-directive">throws</span> Exception {
Parent root = FXMLLoader.<span class="ST32">load</span>(getClass().getResource(<span class="character">"</span><span class="character">Screen1.fxml</span><span class="character">"</span>));
stage.setScene(<span class="keyword-directive">new</span> Scene(root));
stage.show();
}
}
</pre></div><div class="MsoNormal"><b> </b> <b>4. Where I get the jars</b></div><a href="http://search.maven.org/#artifactdetails%7Corg.glassfish.jersey.bundles%7Cjax-rs-ri%7C2.0-m07-1%7Cpom">Jersey jax-rs-ri 2.0-m7</a><br>
<a href="http://search.maven.org/#artifactdetails%7Corg.glassfish.jersey.media%7Cjersey-media-json-jackson%7C2.0-m07-1%7Cjar">Jersey org.glassfish.jersey.media- jackson 2.0m7</a><br>
<a href="http://repository.codehaus.org/org/codehaus/jackson/">jackson</a> <div class="MsoNormal"><o:p></o:p></div><br>
<b><a href="http://pagesperso-orange.fr/paddy.fr/2012/september/PutItAllTogether.zip" >NetBeans project of the Application</a></b> <br><br>
<b><a href="http://pagesperso-orange.fr/paddy.fr/2012/may/RESTfulServices.zip">NetBeans project of the Service</a></b></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-40092795817301066372012-06-18T21:57:00.000+01:002012-06-21T18:31:44.727+01:00JavaFX 2.x custom component compatible with FXML<br />
<div class="MsoNormal">In November, last year, I wrote a little example on how to <a href="http://paddyweblog.blogspot.fr/2011/11/extend-existing-ui-component-in-javafx.html">extend an existing component in JavaFx 2.0</a>.<br />
Today, I would use this component in FXML and make a little demo. <br />
The application for the demo is very simple:</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal">One SearchTextBox component (custom component) with events on OnCrossButtonMouseClicked and OnSearchEvent.</li>
<li class="MsoNormal">One ComboBox to change the font size of the SearchTextBox component.</li>
</ul><div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/tcI57bxytVU?feature=player_embedded' frameborder='0'></iframe></div><div class="MsoNormal"><span style="background: yellow;"><br />
</span></div><a name='more'></a>But before making this simple application, I have to:<br />
<ul style="margin-top: 0in;" type="disc"><li class="MsoNormal">Add a method to change font of the SearchTextBox component (and thus its font size)</li>
<li class="MsoNormal">Fix some bugs</li>
<li class="MsoNormal">Add the FXML compatibility to the SearchTextBox component.</li>
</ul><div class="MsoNormal"><b>Add the font change and fix bugs</b><br />
First, I began by adding the methods to change the font of the SearchTextBox component.<br />
<br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> public Font getFont(){</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> return searchTextBoxSkin.fontProperty.getValue();</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> }</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> public void setFont(Font font){</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> searchTextBoxSkin.fontProperty.setValue(font);</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> }</span><br />
<br />
Then, I have fixed some bugs... <br />
(For example: in the skin class (SearchTextBoxSkin) of the component to correctly render the cross button with any font size <br />
or in the implementation of the method <span style="font-family: 'Courier New';">handle(KeyEvent t)</span>in the SearchTextBox class) <br />
<!--[if !supportLineBreakNewLine]--><br />
<!--[endif]--></div><div class="MsoNormal"><b>Add the FXML compatibility to the SearchTextBox component</b><br />
Normally to use the SearchTextBox component it in FXML, you should write something like this: <br />
<br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"><SearchTextBox fx:id="searchTextBox1" crossButtonMouseClicked="#handleSearchTextBoxCrossButtonOnMouseClicked" </span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> searchEvent="#handleSearchTextBoxSearchEvent"> </span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"></SearchTextBox> </span><br />
<!--[if !supportLineBreakNewLine]--><br />
<!--[endif]--></div><div class="MsoNormal">But, it isn't working because:</div><div class="MsoNormal" style="margin-left: 39.0pt; mso-list: l2 level1 lfo3; tab-stops: list 39.0pt; text-indent: -.25in;"><!--[if !supportLists]-->1.<span style="font-size: 7pt;"> </span><!--[endif]-->An FXML's attribute must have a getter and a setter corresponding to it into the component (my 2 attributes, crossButtonMouseClicked and searchEvent, don't have them<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";">)</span> </div><div class="MsoNormal" style="margin-left: 39.0pt; mso-list: l2 level1 lfo3; tab-stops: list 39.0pt; text-indent: -.25in;"><!--[if !supportLists]-->2.<span style="font-size: 7pt;"> </span><!--[endif]-->The name of the FXML's attribute must begin by <i>on</i> to receive an EventHandler as parameter for the setter corresponding to it in the component. If the attribute doesn't begin by <i>on</i>, the setter will receive a String which contains the value of the attribute.</div><div class="MsoNormal"><br />
So, I added the getters and setters in SearchTextBox<br />
<br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> public void setOnCrossButtonMouseClicked (EventHandler eventHandler){</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> crossButtonEventHandler = eventHandler;</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> }</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> public EventHandler getOnCrossButtonMouseClicked (){</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> return crossButtonEventHandler;</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> }</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> public void setOnSearchEvent(EventHandler eventHandler){</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> searchEventHandler = eventHandler;</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> }</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> public EventHandler getOnSearchEvent(){</span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> return searchEventHandler;</span> <br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> }</span> <br />
</div><div class="MsoNormal">And, I have deprecated the methods <span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";">crossButtonOnMouseClicked</span> and <span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";">searchEvent</span>. <br />
<br />
Now, to use the SearchTextBox component in FXML, you have to write something like this: <br />
<br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"><SearchTextBox fx:id="searchTextBox1" onCrossButtonMouseClicked="#handleSearchTextBoxCrossButtonOnMouseClicked" </span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"> onSearchEvent="#handleSearchTextBoxSearchEvent"> </span><br />
<span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";"></SearchTextBox> </span><br />
<br />
<u>Note:</u> The complete source code of the SearchTextBox component is available at the end of this post. <br />
<br />
<b>Make the application</b><br />
Now, with a custom component working in FXML, write the demo is very simple. <br />
The application consists of:</div><ul style="margin-top: 0in;" type="disc"><li class="MsoNormal">the FXML to describe the UI </li>
<li class="MsoNormal">the controller of the FXML, which contains the code to interact with the UI. </li>
<li class="MsoNormal">and the JavaFX application to load the FXML and use it.</li>
</ul><div class="MsoNormal"><u>The FXML</u><br />
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST1 {font-family: Monospaced; font-weight: bold; font-style: italic}
.ST2 {font-family: Monospaced; font-style: italic}
.ST0 {font-family: Monospaced; font-weight: bold}
.character {color: #ce7b00}
.keyword-directive {color: #0000e6}
.xml-attribute {color: #009900}
.xml-value {color: #ce7b00}
.ST10 {color: #00007c; font-family: Monospaced; font-weight: bold}
.xml-tag {color: #0000e6}
.ST11 {color: #009900}
.ST3 {color: #009900; font-family: Monospaced; font-style: italic}
-->
</style><br />
<table width="100%"><tr><td align="center">Screen1.fxml</td></tr>
</table><pre><span class="ST10"><?</span><span class="ST10">xml</span> version="1.0" encoding="UTF-8"?>
<span class="ST10"><?</span><span class="ST10">import</span> java.lang.*?>
<span class="ST10"><?</span><span class="ST10">import</span> java.util.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.collections.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.scene.control.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.scene.layout.*?>
<span class="ST10"><?</span><span class="ST10">import</span> javafx.scene.paint.*?>
<span class="ST10"><?</span><span class="ST10">import</span> com.paddyweblog.control.*?>
<span class="xml-tag"><VBox</span> <span class="xml-attribute">id</span>=<span class="xml-value">"vBox1"</span>
<span class="xml-attribute">prefWidth</span>=<span class="xml-value">"300.0"</span>
<span class="xml-attribute">prefHeight</span>=<span class="xml-value">"200.0"</span>
<span class="xml-attribute">spacing</span>=<span class="xml-value">"10.0"</span>
<span class="xml-attribute">xmlns:fx</span>=<span class="xml-value">"</span><span class="xml-value">http://javafx.com/fxml</span><span class="xml-value">"</span>
<span class="xml-attribute">fx:controller</span>=<span class="xml-value">"fxmlusercomponent.Screen1"</span><span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><HBox</span> <span class="xml-attribute">id</span>=<span class="xml-value">"hBox1"</span> <span class="xml-attribute">alignment</span>=<span class="xml-value">"CENTER"</span> <span class="xml-attribute">spacing</span>=<span class="xml-value">"10.0"</span> <span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><Label</span> <span class="xml-attribute">id</span>=<span class="xml-value">"label1"</span> <span class="xml-attribute">contentDisplay</span>=<span class="xml-value">"CENTER"</span> <span class="xml-attribute">text</span>=<span class="xml-value">"Size font Text Search Text Box"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><ComboBox</span> <span class="xml-attribute">id</span>=<span class="xml-value">"comboBox1"</span> <span class="xml-attribute">fx:id</span>=<span class="xml-value">"comboBox1"</span> <span class="xml-attribute">onAction</span>=<span class="xml-value">"#handleComboBoxAction"</span> <span class="xml-tag">></span>
<span class="xml-tag"><items</span><span class="xml-tag">></span>
<span class="xml-tag"><FXCollections</span> <span class="xml-attribute">fx:factory</span>=<span class="xml-value">"observableArrayList"</span><span class="xml-tag">></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"10"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"13"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"15"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"20"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"25"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"30"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"35"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"40"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><String</span> <span class="xml-attribute">fx:value</span>=<span class="xml-value">"45"</span> <span class="xml-tag">/></span>
<span class="xml-tag"></FXCollections</span><span class="xml-tag">></span>
<span class="xml-tag"></items</span><span class="xml-tag">></span>
<span class="xml-tag"></ComboBox</span><span class="xml-tag">></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"></HBox</span><span class="xml-tag">></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><SearchTextBox</span> <span class="xml-attribute">fx:id</span>=<span class="xml-value">"searchTextBox1"</span>
<span class="xml-attribute">onCrossButtonMouseClicked</span>=<span class="xml-value">"#handleSearchTextBoxCrossButtonOnMouseClicked"</span>
<span class="xml-attribute">onSearchEvent</span>=<span class="xml-value">"#handleSearchTextBoxSearchEvent"</span><span class="xml-tag">></span>
<span class="xml-tag"></SearchTextBox</span><span class="xml-tag">></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"></VBox</span><span class="xml-tag">></span>
</pre><u>The controller</u></br><br />
<table width="100%"><tr><td align="center">Screen1.java</td></tr>
</table><pre><span class="keyword-directive">package</span> fxmlusercomponent;
<span class="keyword-directive">import</span> com.paddyweblog.control.SearchTextBox;
<span class="keyword-directive">import</span> com.paddyweblog.control.SearchTextBoxEvent;
<span class="keyword-directive">import</span> java.net.URL;
<span class="keyword-directive">import</span> java.util.ResourceBundle;
<span class="keyword-directive">import</span> javafx.event.ActionEvent;
<span class="keyword-directive">import</span> javafx.fxml.FXML;
<span class="keyword-directive">import</span> javafx.fxml.Initializable;
<span class="keyword-directive">import</span> javafx.scene.control.ComboBox;
<span class="keyword-directive">import</span> javafx.scene.input.MouseEvent;
<span class="keyword-directive">import</span> javafx.scene.text.Font;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">Screen1</span> <span class="keyword-directive">implements</span> Initializable {
@FXML
<span class="keyword-directive">private</span> ComboBox <span class="ST11">comboBox1</span>;
@FXML
<span class="keyword-directive">private</span> SearchTextBox <span class="ST11">searchTextBox1</span>;
@FXML
<span class="keyword-directive">private</span> <span class="keyword-directive">void</span> <span class="ST0">handleComboBoxAction</span>(ActionEvent event) {
Font f = <span class="ST11">searchTextBox1</span>.getFont();
String name = f.getName();
<span class="keyword-directive">double</span> sizeValue = Double.<span class="ST2">parseDouble</span>((String)<span class="ST11">comboBox1</span>.getValue());
Font fnew = <span class="keyword-directive">new</span> Font(name,sizeValue);
<span class="ST11">searchTextBox1</span>.setFont(fnew);
}
@FXML
<span class="keyword-directive">private</span> <span class="keyword-directive">void</span> <span class="ST0">handleSearchTextBoxCrossButtonOnMouseClicked</span>(MouseEvent mouseEvent){
System.<span class="ST3">out</span>.println(<span class="character">"</span><span class="character">handleSearchTextBoxCrossButtonOnMouseClicked</span><span class="character">"</span>);
}
@FXML
<span class="keyword-directive">private</span> <span class="keyword-directive">void</span> <span class="ST0">handleSearchTextBoxSearchEvent</span>(SearchTextBoxEvent searchTextBoxEvent){
System.<span class="ST3">out</span>.println(<span class="character">"</span><span class="character">handleSearchTextBoxSearchEvent</span><span class="character">"</span>+searchTextBoxEvent.getText());
<span class="keyword-directive">if</span> (<span class="character">"</span><span class="character">aaaa</span><span class="character">"</span>.equals(searchTextBoxEvent.getText())){
System.<span class="ST3">out</span>.println(<span class="character">"</span><span class="character">Good !</span><span class="character">"</span>);
}
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">initialize</span>(URL url, ResourceBundle rb) {
Font f = <span class="ST11">searchTextBox1</span>.getFont();
<span class="ST11">comboBox1</span>.setValue(String.<span class="ST2">valueOf</span>((<span class="keyword-directive">int</span>)f.getSize()));
}
}
</pre><u>The JavaFX application</u></br><br />
<table width="100%"><tr><td align="center">FxmlUserComponent.java</td></tr>
</table><pre><span class="keyword-directive">package</span> fxmlusercomponent;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> javafx.fxml.FXMLLoader;
<span class="keyword-directive">import</span> javafx.scene.Parent;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">FxmlUserComponent</span> <span class="keyword-directive">extends</span> Application {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST1">main</span>(String[] args) {
Application.<span class="ST2">launch</span>(FxmlUserComponent.<span class="keyword-directive">class</span>, args);
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">start</span>(Stage stage) <span class="keyword-directive">throws</span> Exception {
Parent root = FXMLLoader.<span class="ST2">load</span>(getClass().getResource(<span class="character">"</span><span class="character">Screen1.fxml</span><span class="character">"</span>));
stage.setScene(<span class="keyword-directive">new</span> Scene(root));
stage.show();
}
}
</pre><b>Source code of the SearchTextBox component</b><br />
<br />
<u>The component</u></br><br />
<table width="100%"><tr><td align="center">SearchTextBox.java</td></tr>
</table><pre><span class="keyword-directive">package</span> com.paddyweblog.control;
<span class="keyword-directive">import</span> javafx.event.EventHandler;
<span class="keyword-directive">import</span> javafx.scene.control.TextField;
<span class="keyword-directive">import</span> javafx.scene.input.*;
<span class="keyword-directive">import</span> javafx.scene.text.Font;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">SearchTextBox</span> <span class="keyword-directive">extends</span> TextField{
SearchTextBoxSkin <span class="ST1">searchTextBoxSkin</span> = <span class="keyword-directive">new</span> SearchTextBoxSkin(<span class="keyword-directive">this</span>);
EventHandler <span class="ST1">searchEventHandler</span> = <span class="keyword-directive">null</span>;
EventHandler <span class="ST1">crossButtonEventHandler</span> = <span class="keyword-directive">null</span>;
SearchTextBox <span class="ST1">searchTextBox</span> = <span class="keyword-directive">this</span>;
<span class="keyword-directive">public</span> <span class="ST0">SearchTextBox</span>(){
<span class="keyword-directive">super</span>();
<span class="keyword-directive">this</span>.setSkin(<span class="ST1">searchTextBoxSkin</span>);
<span class="keyword-directive">this</span>.setOnKeyReleased(<span class="keyword-directive">new</span> EventHandler<KeyEvent>(){
<span class="keyword-directive">final</span> KeyCombination <span class="ST1">combo</span> = <span class="keyword-directive">new</span> KeyCodeCombination(KeyCode.<span class="ST2">TRACK_NEXT</span>);
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">handle</span>(KeyEvent t) {
t.consume();
<span class="comment">//SearchTextBoxEvent e = new SearchTextBoxEvent(searchTextBox.getText()+t.getCharacter());</span>
SearchTextBoxEvent e = <span class="keyword-directive">new</span> SearchTextBoxEvent(<span class="ST1">searchTextBox</span>.getText());
<span class="keyword-directive">if</span> (<span class="ST1">searchEventHandler</span>!=<span class="keyword-directive">null</span>){
<span class="ST1">searchEventHandler</span>.handle(e);
}
}
});
<span class="ST1">searchTextBoxSkin</span>.<span class="ST1">crossButton</span>.setOnMouseClicked(<span class="keyword-directive">new</span> EventHandler<MouseEvent>() {
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">handle</span>(MouseEvent t) {
<span class="ST1">searchTextBox</span>.setText(<span class="character">""</span>);
<span class="keyword-directive">if</span> (<span class="ST1">crossButtonEventHandler</span>!=<span class="keyword-directive">null</span>){
<span class="ST1">crossButtonEventHandler</span>.handle(t);
}
}
});
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">setOnCrossButtonMouseClicked</span> (EventHandler eventHandler){
<span class="ST1">crossButtonEventHandler</span> = eventHandler;
}
<span class="keyword-directive">public</span> EventHandler <span class="ST0">getOnCrossButtonMouseClicked</span> (){
<span class="keyword-directive">return</span> <span class="ST1">crossButtonEventHandler</span>;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">setOnSearchEvent</span>(EventHandler eventHandler){
<span class="ST1">searchEventHandler</span> = eventHandler;
}
<span class="keyword-directive">public</span> EventHandler <span class="ST0">getOnSearchEvent</span>(){
<span class="keyword-directive">return</span> <span class="ST1">searchEventHandler</span>;
}
@Deprecated
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">crossButtonOnMouseClicked</span>(EventHandler eventHandler){
<span class="ST1">crossButtonEventHandler</span> = eventHandler;
}
@Deprecated
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">searchEvent</span>(EventHandler eventHandler){
<span class="ST1">searchEventHandler</span> = eventHandler;
}
<span class="keyword-directive">public</span> Font <span class="ST0">getFont</span>(){
<span class="keyword-directive">return</span> <span class="ST1">searchTextBoxSkin</span>.<span class="ST1">fontProperty</span>.getValue();
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">setFont</span>(Font font){
<span class="ST1">searchTextBoxSkin</span>.<span class="ST1">fontProperty</span>.setValue(font);
}
}
</pre><u>The component skin</u></br><br />
<table width="100%"><tr><td align="center">SearchTextBoxSkin.java</td></tr>
</table><pre><span class="keyword-directive">package</span> com.paddyweblog.control;
<span class="keyword-directive">import</span> com.sun.javafx.scene.control.skin.TextFieldSkin;
<span class="keyword-directive">import</span> javafx.beans.binding.DoubleBinding;
<span class="keyword-directive">import</span> javafx.beans.property.ObjectProperty;
<span class="keyword-directive">import</span> javafx.beans.value.ChangeListener;
<span class="keyword-directive">import</span> javafx.beans.value.ObservableValue;
<span class="keyword-directive">import</span> javafx.geometry.Insets;
<span class="keyword-directive">import</span> javafx.geometry.Pos;
<span class="keyword-directive">import</span> javafx.scene.Group;
<span class="keyword-directive">import</span> javafx.scene.paint.Color;
<span class="keyword-directive">import</span> javafx.scene.shape.Circle;
<span class="keyword-directive">import</span> javafx.scene.shape.Rectangle;
<span class="keyword-directive">import</span> javafx.scene.text.Font;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">SearchTextBoxSkin</span> <span class="keyword-directive">extends</span> TextFieldSkin{
SearchTextBox <span class="ST1">searchTextBox</span>;
Group <span class="ST1">crossButton</span> = <span class="keyword-directive">new</span> Group();
ObjectProperty<Insets> <span class="ST1">paddingProperty</span> = <span class="keyword-directive">this</span>.paddingProperty();
ObjectProperty<Font> <span class="ST1">fontProperty</span> = <span class="keyword-directive">this</span>.<span class="ST1">font</span>;
<span class="keyword-directive">public</span> <span class="ST0">SearchTextBoxSkin</span>(<span class="keyword-directive">final</span> SearchTextBox searchTextBox){
<span class="keyword-directive">super</span>(searchTextBox);
<span class="keyword-directive">this</span>.<span class="ST1">searchTextBox</span> = searchTextBox;
<span class="ST1">crossButton</span>.setFocusTraversable(<span class="keyword-directive">false</span>);
DoubleBinding crossWidth = searchTextBox.heightProperty().multiply(0.45);
DoubleBinding crossHeight = searchTextBox.heightProperty().multiply(0.05);
Circle circle = <span class="keyword-directive">new</span> Circle();
circle.setFill(Color.<span class="ST2">GRAY</span>);
circle.radiusProperty().bind(searchTextBox.heightProperty().multiply(0.325));
circle.setFocusTraversable(<span class="keyword-directive">false</span>);
Rectangle rect1 = <span class="keyword-directive">new</span> Rectangle();
rect1.widthProperty().bind(crossWidth);
rect1.heightProperty().bind(crossHeight);
rect1.setFill(Color.<span class="ST2">WHITE</span>);
rect1.setRotate(45);
rect1.translateXProperty().bind(crossWidth.divide(2).negate());
rect1.translateYProperty().bind(crossHeight.divide(2).negate());
rect1.setFocusTraversable(<span class="keyword-directive">false</span>);
Rectangle rect2 = <span class="keyword-directive">new</span> Rectangle();
rect2.widthProperty().bind(crossWidth);
rect2.heightProperty().bind(crossHeight);
rect2.setFill(Color.<span class="ST2">WHITE</span>);
rect2.setRotate(-45);
rect2.translateXProperty().bind(crossWidth.divide(2).negate());
rect2.translateYProperty().bind(crossHeight.divide(2).negate());
rect2.setFocusTraversable(<span class="keyword-directive">false</span>);
<span class="ST1">crossButton</span>.getChildren().add(circle);
<span class="ST1">crossButton</span>.getChildren().add(rect1);
<span class="ST1">crossButton</span>.getChildren().add(rect2);
<span class="ST1">crossButton</span>.translateXProperty().bind(searchTextBox.widthProperty().subtract(searchTextBox.heightProperty()));
<span class="ST1">crossButton</span>.visibleProperty().bind(searchTextBox.textProperty().greaterThan(<span class="character">""</span>));
getChildren().add(<span class="ST1">crossButton</span>);
SearchTextBoxSkin.<span class="ST3">setAlignment</span>(<span class="ST1">crossButton</span>,Pos.<span class="ST2">CENTER_LEFT</span>);
searchTextBox.heightProperty().addListener(<span class="keyword-directive">new</span> ChangeListener(){
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">changed</span>(ObservableValue ov, Object t, Object t1) {
Double d = (Double)t1;
<span class="ST1">paddingProperty</span>.set(<span class="keyword-directive">new</span> Insets(3,d.intValue(),3,3));
}
} );
}
}
</pre><br />
<u>The custom event</u></br><br />
<table width="100%"><tr><td align="center">SearchTextBoxEvent.java</td></tr>
</table><pre><span class="keyword-directive">package</span> com.paddyweblog.control;
<span class="keyword-directive">import</span> javafx.event.Event;
<span class="keyword-directive">import</span> javafx.event.EventType;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">SearchTextBoxEvent</span> <span class="keyword-directive">extends</span> Event {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">final</span> EventType<SearchTextBoxEvent> <span class="ST1">SEARCHTEXTBOXEVENT</span> = <span class="keyword-directive">new</span> EventType(Event.<span class="ST1">ANY</span>, <span class="character">"</span><span class="character">SEARCHTEXTBOXEVENT</span><span class="character">"</span>);
<span class="keyword-directive">public</span> <span class="ST0">SearchTextBoxEvent</span>(String text){
<span class="keyword-directive">super</span>(<span class="ST1">SEARCHTEXTBOXEVENT</span>);
<span class="keyword-directive">this</span>.<span class="ST11">text</span> = text;
}
<span class="keyword-directive">private</span> String <span class="ST11">text</span>;
<span class="keyword-directive">public</span> String <span class="ST0">getText</span>() {
<span class="keyword-directive">return</span> <span class="ST11">text</span>;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">setText</span>(String text) {
<span class="keyword-directive">this</span>.<span class="ST11">text</span> = text;
}
}
</pre><br />
<b><a href="http://pagesperso-orange.fr/paddy.fr//2012/june/FxmlUserComponent.zip">NetBeans project</a></b></div><!--[if !supportLineBreakNewLine]--><br />
<!--[endif]-->Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com2tag:blogger.com,1999:blog-6224595597588014495.post-32458097348154723742012-05-23T21:24:00.000+01:002012-05-23T22:02:36.124+01:00RESTful client in Java with JAX-RS 2.0 Client API (JSON update)<br />
<div class="Standard">
<span style=" mso-bidi-font-size: 12.0pt;">When
I wrote <a href="http://paddyweblog.blogspot.fr/2012/05/restful-client-in-java-with-jax-rs-20.html">RESTful client in Java with JAX-RS 2.0 Client API</a>, I thought that JSON
serialization/deserialization was not working with Jersey 2.0-m3.</span><span style=""><br/>But,
in fact, it works as designed and Martin Matula gives us the solution in his
<a href="http://www.blogger.com/comment.g?blogID=6224595597588014495&postID=5900475581061811911">second comment</a> and in <a href="http://java.net/jira/browse/JERSEY-1142">JIRA</a>).
</span></div>
<div class="Standard">
<span style="">To
use the JSON serialization/deserialization (with Jersey 2.0m3), you have to:</span>
<br />
<ul>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style="text-indent: -0.25in;"><span style="">enable the JsonFeature on the client with the line:</span><span style="font-size: 14px;"><br /></span></span><i style="text-indent: -0.25in;"><span style="font-family: 'Courier New'; font-size: 10pt;">client.configuration().enable(new JsonFeature());</span></i></li>
<li><span style="font-family: Symbol; text-indent: -0.25in;"><span style="font-family: 'Times New Roman'; font-size: 7pt;"> </span></span><span style=" text-indent: -0.25in;">and add the jars:</span><br/><span style=" text-indent: -24px;">jersey-media-json-2.0, </span><span style=" text-indent: -24px;">jackson-jaxrs,
jackson-core-asl, jackson-mapper-asl and jackson-xc</span></li>
</ul>
</div>
<div class="Standard">
</div>
<a name='more'></a><span style="">The Client using JAX-RS Client API, with the JSON
deserialization, is as follows:<br /><br/></span>
<div class="Standard">
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST4 {font-family: Monospaced; font-weight: bold; font-style: italic}
.ST3 {font-family: Monospaced; font-style: italic}
.ST0 {font-family: Monospaced; font-weight: bold}
.comment {color: #969696}
.character {color: #ce7b00}
.ST2 {color: #009900; font-family: Monospaced; font-style: italic}
.ST1 {color: #009900}
.keyword-directive {color: #0000e6}
-->
</style>
<table width="100%"><tr><td align="center">JavaClientRESTFul20Extend.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> javaclientrestful20;
<span class="keyword-directive">import</span> java.util.List;
<span class="keyword-directive">import</span> javax.ws.rs.client.Client;
<span class="keyword-directive">import</span> javax.ws.rs.core.GenericType;
<span class="keyword-directive">import</span> javax.ws.rs.core.MediaType;
<span class="keyword-directive">import</span> javax.ws.rs.ext.ClientFactory;
<span class="keyword-directive">import</span> org.glassfish.jersey.media.json.JsonFeature;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">JavaClientRESTFul20Extend</span> {
<span class="comment">// curl </span><span class="comment">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/Arc</span>
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST4">main</span>(String[] args) {
<span class="comment">//String artistBeginBy = "Arc";</span>
String artistBeginBy = <span class="character">"</span><span class="character">Arch</span><span class="character">"</span>;
JavaClientRESTFul20Extend clientfindArtistByName = <span class="keyword-directive">new</span> JavaClientRESTFul20Extend();
List<Music> listMusic = clientfindArtistByName.findArtistByName(artistBeginBy);
System.<span class="ST2">out</span>.println(<span class="character">"</span><span class="character">listMusic : </span><span class="character">"</span>+listMusic);
}
<span class="keyword-directive">protected</span> List<Music> <span class="ST0">findArtistByName</span>(String artistBeginBy){
Client client = ClientFactory.<span class="ST3">newClient</span>();
client.configuration().enable(<span class="keyword-directive">new</span> JsonFeature());
ListMusic listMusic = client.target(<span class="character">"</span><span class="character">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="character">"</span>)
.path(<span class="character">"</span><span class="character">{beginBy}</span><span class="character">"</span>)
.pathParam(<span class="character">"</span><span class="character">beginBy</span><span class="character">"</span>, artistBeginBy)
.request(MediaType.<span class="ST2">APPLICATION_JSON</span>)
.get(ListMusic.<span class="keyword-directive">class</span>);
<span class="keyword-directive">return</span> listMusic.getMusic();
}
}
</pre>
</div>
<div class="Standard">
<span style="">
I use a class (ListMusic.java) to wrap the list, because my
restful service returns something like this:</span></div>
<div class="Standard">
<i><span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";">{"music":[{"albumTitle":"Funeral","artisteName":"Arcade
Fire","id":"10"},{"albumTitle":"Neon
bible","artisteName":"Arcade
Fire","id":"11"}]}</span></i></div>
<div class="Standard"><span style="">
<o:p> </o:p>instead of JSON array like this:</span></div>
<div class="Standard">
<i><span style="font-family: 'Courier New'; font-size: 10pt;">[{"albumTitle":"Funeral","artisteName":"Arcade
Fire","id":"10"},{"albumTitle":"Neon
bible","artisteName":"Arcade
Fire","id":"11"}]</span></i></div><br/>
<div class="Standard">
<table width="100%"><tr><td align="center">ListMusic.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> javaclientrestful20;
<span class="keyword-directive">import</span> java.util.ArrayList;
<span class="keyword-directive">import</span> java.util.List;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">ListMusic</span> {
List<Music> <span class="ST1">music</span> = <span class="keyword-directive">new</span> ArrayList();
<span class="keyword-directive">public</span> List<Music> <span class="ST0">getMusic</span>() {
<span class="keyword-directive">return</span> <span class="ST1">music</span>;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> <span class="ST0">setMusic</span>(List<Music> music) {
<span class="keyword-directive">this</span>.<span class="ST1">music</span> = music;
}
<span class="keyword-directive">public</span> String <span class="ST0">toString</span>(){
<span class="keyword-directive">return</span> <span class="ST1">music</span>.toString();
}
}
</pre>
</div>
<div class="Standard"><span style="">
<b><a href="http://pagesperso-orange.fr/paddy.fr/2012/may/JavaClientRESTFul2.0-Json.zip">NetBeans project of the Client (JSON)</a></b></span></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-59004755810618119112012-05-10T20:45:00.001+01:002012-05-11T21:10:16.127+01:00RESTful client in Java with JAX-RS 2.0 Client API<br />
<div class="Standard">
</div>
<div class="Standard">
On october 21th 2010, I wrote a <a href="http://paddyweblog.blogspot.fr/2010/10/restful-client-in-java.html">RESTful client in Java</a>. We
are now in 2012, and the next version of JAX-RS (the 2.0 and which will be
included as part of Java EE 7) will include a client API.<br />
<br />
The JAX-RS 2.0 specification is still work in progress, but a few
implementations already exist (in beta or in the first milestones).<br />
<br />
To begin to explore the JAX-RS Client API, I decided to use the <a href="http://repo1.maven.org/maven2/org/glassfish/jersey/bundles/jax-rs-ri/2.0-m03/">Jerseyimplementation (which is the JAX-RS's reference implementation)</a> and the same
<a href="http://paddyweblog.blogspot.fr/2010/07/restful-service-with-jax-rs-and-jpa-2.html">RESTful service</a> that I used in <a href="http://paddyweblog.blogspot.fr/2010/10/restful-client-in-java.html">RESTful client in JAVA</a>.<br />
</div>
<a name='more'></a>
<b><u>Modification of the RESTful service</u></b><br />
The only modification in <a href="http://paddyweblog.blogspot.fr/2010/07/restful-service-with-jax-rs-and-jpa-2.html">the service</a> is the addition of the XML support in
addition to JSON.<br />
I replaced the line :<br />
<i><span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";">@Produces ("application/json")</span></i><br />
by :<br />
<i><span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";">@Produces({MediaType.APPLICATION_XML,MediaType.APPLICATION_JSON})</span></i><br />
<br /><strike>
I added the XML support because with the JAX-RS 2.0 implementation that I
chose, Jersey's milestone 3, the parsing
of the list of object (in my case List<Music>) isn't working with JSON,
but it's working with the XML.</strike>
<div class="Standard">
<b><span style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Verdana, sans-serif; font-size: 10pt;">[update May 11, 2012]</span></b><span style="background-attachment: initial; background-clip: initial; background-color: white; background-image: initial; background-origin: initial; background-position: initial initial; background-repeat: initial initial; font-family: Verdana, sans-serif; font-size: 10pt;"> JSON
de-/serialization works, read the second comment of Martin Matula</span></div>
<br />
<b><u>The Client using JAX-RS Client API</u></b><br />
The easier way to call the service with the client API using a GET query is to
write something like this :<br /><br/>
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST1 {font-family: Monospaced; font-weight: bold; font-style: italic}
.ST3 {font-family: Monospaced; font-style: italic}
.ST0 {font-family: Monospaced; font-weight: bold}
.comment {color: #969696}
.character {color: #ce7b00}
.ST2 {color: #009900; font-family: Monospaced; font-style: italic}
.keyword-directive {color: #0000e6}
-->
</style>
<table width="100%"><tr><td align="center">JavaClientRESTFul20.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> javaclientrestful20;
<span class="keyword-directive">import</span> java.util.List;
<span class="keyword-directive">import</span> javax.ws.rs.client.Client;
<span class="keyword-directive">import</span> javax.ws.rs.core.GenericType;
<span class="keyword-directive">import</span> javax.ws.rs.core.MediaType;
<span class="keyword-directive">import</span> javax.ws.rs.ext.ClientFactory;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">JavaClientRESTFul20</span> {
<span class="comment">// curl </span><span class="comment">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/Arc</span>
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST1">main</span>(String[] args) {
Client client = ClientFactory.<span class="ST2">newClient</span>();
GenericType<List<Music>> listm = <span class="keyword-directive">new</span> GenericType<List<Music>>() {};
List<Music> listMusic = client.target(<span class="character">"</span><span class="character">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/Arc</span><span class="character">"</span>)
.request(MediaType.<span class="ST3">APPLICATION_XML</span>)
.get(listm);
System.<span class="ST3">out</span>.println(<span class="character">"</span><span class="character">listMusic : </span><span class="character">"</span>+listMusic);
}
}
</pre></br>
But as my service take a parameter from the path, the best
way is to write something like this :<br /></br>
<table width="100%"><tr><td align="center">JavaClientRESTFul20Extend.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> javaclientrestful20;
<span class="keyword-directive">import</span> java.util.List;
<span class="keyword-directive">import</span> javax.ws.rs.client.Client;
<span class="keyword-directive">import</span> javax.ws.rs.core.GenericType;
<span class="keyword-directive">import</span> javax.ws.rs.core.MediaType;
<span class="keyword-directive">import</span> javax.ws.rs.ext.ClientFactory;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> <span class="ST0">JavaClientRESTFul20Extend</span> {
<span class="comment">// curl </span><span class="comment">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/Arc</span>
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> <span class="ST1">main</span>(String[] args) {
String artistBeginBy = <span class="character">"</span><span class="character">Arc</span><span class="character">"</span>;
<span class="comment">//String artistBeginBy = "Arch";</span>
JavaClientRESTFul20Extend clientfindArtistByName = <span class="keyword-directive">new</span> JavaClientRESTFul20Extend();
List<Music> listMusic = clientfindArtistByName.findArtistByName(artistBeginBy);
System.<span class="ST2">out</span>.println(<span class="character">"</span><span class="character">listMusic : </span><span class="character">"</span>+listMusic);
}
<span class="keyword-directive">protected</span> List<Music> <span class="ST0">findArtistByName</span>(String artistBeginBy){
Client client = ClientFactory.<span class="ST3">newClient</span>();
GenericType<List<Music>> listm = <span class="keyword-directive">new</span> GenericType<List<Music>>() {};
List<Music> listMusic = client.target(<span class="character">"</span><span class="character">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="character">"</span>)
.path(<span class="character">"</span><span class="character">{beginBy}</span><span class="character">"</span>)
.pathParam(<span class="character">"</span><span class="character">beginBy</span><span class="character">"</span>, artistBeginBy)
.request(MediaType.<span class="ST2">APPLICATION_XML</span>)
.get(listm);
<span class="keyword-directive">return</span> listMusic;
}
}
</pre></br>
<div class="Standard">
<u>Note :</u> On internet, I read that you should be able write
something like this to pass a path parameter</div>
<div class="Standard">
<i><span style="font-family: "Courier New"; font-size: 10.0pt; mso-bidi-font-family: "Arial Unicode MS";">List<Music> listMusic =
client.target<br />
("http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/{beginBy}")<br />
.pathParam("beginBy", artistBeginBy)<br />
.request(MediaType.APPLICATION_XML)<br />
.get(listm);<br />
</span></i><br />But it's not working with Jersey milestone 3.<br /><br /><u>The class Music used by the client above</u></div>
<table width="100%"><tr><td align="center">Music.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> javaclientrestful20;
<span class="keyword-directive">import</span> java.io.Serializable;
<span class="keyword-directive">import</span> javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> Music <span class="keyword-directive">implements</span> Serializable {
<span class="keyword-directive">private</span> Long id;
<span class="keyword-directive">private</span> String artisteName;
<span class="keyword-directive">private</span> String albumTitle;
<span class="keyword-directive">public</span> Music() {
}
<span class="keyword-directive">public</span> String getAlbumTitle() {
<span class="keyword-directive">return</span> albumTitle;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setAlbumTitle(String albumTitle) {
<span class="keyword-directive">this</span>.albumTitle = albumTitle;
}
<span class="keyword-directive">public</span> String getArtisteName() {
<span class="keyword-directive">return</span> artisteName;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setArtisteName(String artisteName) {
<span class="keyword-directive">this</span>.artisteName = artisteName;
}
<span class="keyword-directive">public</span> Long getId() {
<span class="keyword-directive">return</span> id;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setId(Long id) {
<span class="keyword-directive">this</span>.id = id;
}
@Override
<span class="keyword-directive">public</span> String toString(){
StringBuilder sb = <span class="keyword-directive">new</span> StringBuilder();
sb.append(<span class="character">"</span><span class="character">id : </span><span class="character">"</span>);sb.append(id);sb.append(<span class="character">"</span><span class="character"> ; </span><span class="character">"</span>);
sb.append(<span class="character">"</span><span class="character">artisteName : </span><span class="character">"</span>);sb.append(artisteName);sb.append(<span class="character">"</span><span class="character"> ; </span><span class="character">"</span>);
sb.append(<span class="character">"</span><span class="character">albumTitle : </span><span class="character">"</span>);sb.append(albumTitle);
sb.append(<span class="character">"</span> <span class="ST0">\n</span><span class="character">"</span>);
<span class="keyword-directive">return</span> sb.toString();
}
}
</pre>
<div class="Standard">
<b><br /><a href="http://pagesperso-orange.fr/paddy.fr/2012/may/RESTfulServices.zip">NetBeans project of the Service</a></b></div>
<div class="Standard">
<b><br /><a href="http://pagesperso-orange.fr/paddy.fr/2012/may/JavaClientRESTFul2.0.zip">NetBeans project of the Client</a></b></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com3tag:blogger.com,1999:blog-6224595597588014495.post-47126552201594667832011-11-17T22:39:00.000+01:002011-11-17T22:53:59.499+01:00Extend an existing UI component in JavaFX 2.0<br />
<div class="Standard">
Last year, I coded a
<a href="http://paddyweblog.blogspot.com/2010/05/javafx-custom-component-in-javafx-13.html">custom component on JavaFX 1.x</a>, then naturally I wished to rewrite it on JavaFX 2.0.<br/>
To do this, i tried
different solutions, like creating to a
totally new component with <a href="http://drdobbs.com/blogs/java/229400781">this method</a>. </div>
<div class="Standard">
But, it isn't a great
solution when you want to customize or to enhance an existing component, like I
want to do.<br/>
To rewrite my custom
component, I chose to extend an existing control (<i>TextField</i> in my case)
and its skin, because you cannot add content directly in the control but you
can do that in its skin.<o:p></o:p></div>
<div class="Standard">
<br /></div>
<div class="separator" style="clear: both; text-align: center;">
<a href="http://3.bp.blogspot.com/-mo-1Udj3Dn8/TsV75LdQeWI/AAAAAAAAAK8/IMwa_ObM9G8/s1600/extend-ui-control.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="205" src="http://3.bp.blogspot.com/-mo-1Udj3Dn8/TsV75LdQeWI/AAAAAAAAAK8/IMwa_ObM9G8/s320/extend-ui-control.png" width="320" /></a></div>
<div class="Standard">
<br /></div>
<a name='more'></a><br />
<div class="Standard">
<u><span style="color: #333333; mso-ansi-language: EN-US;">Description
of the implementation<o:p></o:p></span></u></div>
<div class="Standard">
My control's class ( <i>SearchTextBox</i>
) extends the TextField's control and implements my SearchTextBox events (<i>crossButtonOnMouseClicked</i>
& <i>searchEvent</i>).<o:p></o:p><br/>
And my skin's class ( <i>SearchTextBoxSkin</i>
) extends <i>TextFieldSkin</i> to add the reset button in the original
TextField.<o:p></o:p><br/>
I also created a new
EventType ( <i>SearchTextBoxEvent</i> ) to manage the <i>searchEvent</i>.<o:p></o:p></div>
<div class="Standard">
<u>The component code<o:p></o:p></u></div><br/>
<div class="Standard">
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.character {color: #ce7b00}
.keyword-directive {color: #0000e6}
-->
</style>
<table width="100%"><tr><td align="center">SearchTextBox.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> com.paddyweblog.control;
<span class="keyword-directive">import</span> javafx.event.EventHandler;
<span class="keyword-directive">import</span> javafx.scene.control.TextField;
<span class="keyword-directive">import</span> javafx.scene.input.*;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> SearchTextBox <span class="keyword-directive">extends</span> TextField{
SearchTextBoxSkin searchTextBoxSkin = <span class="keyword-directive">new</span> SearchTextBoxSkin(<span class="keyword-directive">this</span>);
EventHandler searchEventHandler = <span class="keyword-directive">null</span>;
EventHandler crossButtonEventHandler = <span class="keyword-directive">null</span>;
SearchTextBox searchTextBox = <span class="keyword-directive">this</span>;
<span class="keyword-directive">public</span> SearchTextBox(){
<span class="keyword-directive">super</span>();
<span class="keyword-directive">this</span>.setSkin(searchTextBoxSkin);
<span class="keyword-directive">this</span>.setOnKeyReleased(<span class="keyword-directive">new</span> EventHandler<KeyEvent>(){
<span class="keyword-directive">final</span> KeyCombination combo = <span class="keyword-directive">new</span> KeyCodeCombination(KeyCode.TRACK_NEXT);
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> handle(KeyEvent t) {
t.consume();
SearchTextBoxEvent e = <span class="keyword-directive">new</span> SearchTextBoxEvent(searchTextBox.getText()+t.getCharacter());
searchEventHandler.handle(e);
}
});
searchTextBoxSkin.crossButton.setOnMouseClicked(<span class="keyword-directive">new</span> EventHandler<MouseEvent>() {
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> handle(MouseEvent t) {
searchTextBox.setText(<span class="character">""</span>);
<span class="keyword-directive">if</span> (crossButtonEventHandler!=<span class="keyword-directive">null</span>){
crossButtonEventHandler.handle(t);
}
}
});
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> crossButtonOnMouseClicked(EventHandler eventHandler){
crossButtonEventHandler = eventHandler;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> searchEvent(EventHandler eventHandler){
searchEventHandler = eventHandler;
}
}
</pre>
</div>
<div class="Standard">
<br /></div>
<div class="Standard">
<table width="100%"><tr><td align="center">SearchTextBoxSkin.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> com.paddyweblog.control;
<span class="keyword-directive">import</span> com.sun.javafx.scene.control.skin.TextFieldSkin;
<span class="keyword-directive">import</span> javafx.beans.binding.DoubleBinding;
<span class="keyword-directive">import</span> javafx.geometry.Insets;
<span class="keyword-directive">import</span> javafx.geometry.Pos;
<span class="keyword-directive">import</span> javafx.scene.Group;
<span class="keyword-directive">import</span> javafx.scene.paint.Color;
<span class="keyword-directive">import</span> javafx.scene.shape.Circle;
<span class="keyword-directive">import</span> javafx.scene.shape.Rectangle;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> SearchTextBoxSkin <span class="keyword-directive">extends</span> TextFieldSkin{
SearchTextBox searchTextBox;
Group crossButton = <span class="keyword-directive">new</span> Group();
<span class="keyword-directive">public</span> SearchTextBoxSkin(<span class="keyword-directive">final</span> SearchTextBox searchTextBox){
<span class="keyword-directive">super</span>(searchTextBox);
<span class="keyword-directive">this</span>.searchTextBox = searchTextBox;
crossButton.setFocusTraversable(<span class="keyword-directive">false</span>);
DoubleBinding crossWidth = searchTextBox.heightProperty().multiply(0.45);
DoubleBinding crossHeight = searchTextBox.heightProperty().multiply(0.05);
Circle circle = <span class="keyword-directive">new</span> Circle();
circle.setFill(Color.GRAY);
circle.radiusProperty().bind(searchTextBox.heightProperty().multiply(0.325));
circle.setFocusTraversable(<span class="keyword-directive">false</span>);
Rectangle rect1 = <span class="keyword-directive">new</span> Rectangle();
rect1.widthProperty().bind(crossWidth);
rect1.heightProperty().bind(crossHeight);
rect1.setFill(Color.WHITE);
rect1.setRotate(45);
rect1.translateXProperty().bind(crossWidth.divide(2).negate());
rect1.translateYProperty().bind(crossHeight.divide(2).negate());
rect1.setFocusTraversable(<span class="keyword-directive">false</span>);
Rectangle rect2 = <span class="keyword-directive">new</span> Rectangle();
rect2.widthProperty().bind(crossWidth);
rect2.heightProperty().bind(crossHeight);
rect2.setFill(Color.WHITE);
rect2.setRotate(-45);
rect2.translateXProperty().bind(crossWidth.divide(2).negate());
rect2.translateYProperty().bind(crossHeight.divide(2).negate());
rect2.setFocusTraversable(<span class="keyword-directive">false</span>);
crossButton.getChildren().add(circle);
crossButton.getChildren().add(rect1);
crossButton.getChildren().add(rect2);
crossButton.translateXProperty().bind(searchTextBox.widthProperty().subtract(searchTextBox.heightProperty()));
crossButton.visibleProperty().bind(searchTextBox.textProperty().greaterThan(<span class="character">""</span>));
getChildren().add(crossButton);
SearchTextBoxSkin.setAlignment(crossButton,Pos.CENTER_LEFT);
<span class="keyword-directive">this</span>.setPadding(<span class="keyword-directive">new</span> Insets(3,17,3,3));
}
}
</pre>
</div>
<div class="Standard">
<br /></div>
<div class="Standard">
<table width="100%"><tr><td align="center">SearchTextBoxEvent.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> com.paddyweblog.control;
<span class="keyword-directive">import</span> javafx.event.Event;
<span class="keyword-directive">import</span> javafx.event.EventType;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> SearchTextBoxEvent <span class="keyword-directive">extends</span> Event {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">final</span> EventType<SearchTextBoxEvent> SEARCHTEXTBOXEVENT = <span class="keyword-directive">new</span> EventType(Event.ANY, <span class="character">"</span><span class="character">SEARCHTEXTBOXEVENT</span><span class="character">"</span>);
<span class="keyword-directive">public</span> SearchTextBoxEvent(String text){
<span class="keyword-directive">super</span>(SEARCHTEXTBOXEVENT);
<span class="keyword-directive">this</span>.text = text;
}
<span class="keyword-directive">private</span> String text;
<span class="keyword-directive">public</span> String getText() {
<span class="keyword-directive">return</span> text;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setText(String text) {
<span class="keyword-directive">this</span>.text = text;
}
}
</pre>
</div>
<div class="Standard">
<br /></div>
<div class="Standard">
<u>The Application
code, to test the SearchTextBox component<o:p></o:p></u></div>
<div class="Standard">
<br /></div>
<div class="Standard">
<table width="100%"><tr><td align="center">SearchTextBoxControl.java</td></tr></table>
<pre>
<span class="keyword-directive">package</span> searchtextboxcontrol;
<span class="keyword-directive">import</span> com.paddyweblog.control.SearchTextBox;
<span class="keyword-directive">import</span> com.paddyweblog.control.SearchTextBoxEvent;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> javafx.event.ActionEvent;
<span class="keyword-directive">import</span> javafx.event.EventHandler;
<span class="keyword-directive">import</span> javafx.scene.Group;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.scene.control.Button;
<span class="keyword-directive">import</span> javafx.scene.input.MouseEvent;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> SearchTextBoxControl <span class="keyword-directive">extends</span> Application {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> main(String[] args) {
Application.launch(args);
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> start(Stage primaryStage) {
primaryStage.setTitle(<span class="character">"</span><span class="character">Test SearchTextBox control</span><span class="character">"</span>);
Group root = <span class="keyword-directive">new</span> Group();
Scene scene = <span class="keyword-directive">new</span> Scene(root, 300, 250);
Button btn = <span class="keyword-directive">new</span> Button();
btn.setLayoutX(10);
btn.setLayoutY(100);
btn.setText(<span class="character">"</span><span class="character">just a button to change focus</span><span class="character">"</span>);
btn.setOnAction(<span class="keyword-directive">new</span> EventHandler<ActionEvent>() {
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> handle(ActionEvent event) {
System.out.println(<span class="character">"</span><span class="character">just a button to change focus</span><span class="character">"</span>);
}
});
root.getChildren().add(btn);
SearchTextBox stb = <span class="keyword-directive">new</span> SearchTextBox();
stb.setLayoutX(10);
stb.setLayoutY(50);
stb.setPrefWidth(150);
stb.crossButtonOnMouseClicked(<span class="keyword-directive">new</span> EventHandler<MouseEvent>(){
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> handle(MouseEvent t) {
System.out.println(<span class="character">"</span><span class="character">CrossButtonOnMouseClicked</span><span class="character">"</span>);
}
});
stb.searchEvent(<span class="keyword-directive">new</span> EventHandler<SearchTextBoxEvent>(){
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> handle(SearchTextBoxEvent t) {
System.out.println(<span class="character">"</span><span class="character">searchEventHandler : </span><span class="character">"</span>+t.getText());
}
});
root.getChildren().add(stb);
primaryStage.setScene(scene);
primaryStage.show();
}
}
</pre>
</div>
<div class="Standard">
<br /></div>
<div class="Standard">
<b><a href="http://pagesperso-orange.fr/paddy.fr/2011/november/SearchTextBoxControl.zip">Get the NetBeans project</a></b><o:p></o:p></div>
<div class="Standard">
Note: You probably
should to change the Java Platform from the projet properties>librairies (to
choose your JavaFX 2.0 Platform) to run the project in NetBeans<o:p></o:p></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com5tag:blogger.com,1999:blog-6224595597588014495.post-78291296659920967002011-08-04T21:03:00.003+01:002011-08-05T19:39:05.556+01:00A very simple example using FXML (JavaFX 2.0 b37)<b>update August 05, 2011: cleaner code and runs in b38.</b><br />
<div class="MsoNormal"></div><div class="MsoNormal"><span lang="EN-GB" style="mso-ansi-language: EN-GB;">This example is a very simple JavaFX application using FXML. It could certainly be improved, but it's just enough to begin to play.<o:p></o:p></span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://3.bp.blogspot.com/-_61ocIM3w_U/Tjr23npqKfI/AAAAAAAAAKU/IE3zs-acVVU/s1600/Fxml-august2011.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="216" src="http://3.bp.blogspot.com/-_61ocIM3w_U/Tjr23npqKfI/AAAAAAAAAKU/IE3zs-acVVU/s320/Fxml-august2011.jpg" width="320" /></a></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><span lang="EN-GB" style="mso-ansi-language: EN-GB;"></span></div><a name='more'></a>The application is made up of 3 files, which are:<o:p></o:p><br />
<div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;"><span lang="EN-GB" style="font-family: Symbol; mso-ansi-language: EN-GB; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-GB" style="mso-ansi-language: EN-GB;">The FXML file<o:p></o:p></span></div><style type="text/css"><!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.xml-attribute {color: #009900}
.xml-value {color: #ce7b00}
.ST0 {color: #00007c; font-family: Monospaced; font-weight: bold}
.xml-tag {color: #0000e6}
.character {color: #ce7b00}
.keyword-directive {color: #0000e6}
--></style><br />
<table width="100%"><tr><td align="center">Screen1.xml</td></tr>
</table><pre><span class="ST0"><?</span><span class="ST0">import</span> javafx.scene.*?>
<span class="ST0"><?</span><span class="ST0">import</span> javafx.scene.control.*?>
<span class="ST0"><?</span><span class="ST0">import</span> fxml.MyGroup?>
<span class="xml-tag"><MyGroup</span> <span class="xml-attribute">xmlns:fx</span>=<span class="xml-value">"http://javafx.com/fxml"</span><span class="xml-tag">></span>
<span class="xml-tag"><children</span><span class="xml-tag">></span>
<span class="xml-tag"><Button</span> <span class="xml-attribute">text</span>=<span class="xml-value">"Click Me!"</span> <span class="xml-attribute">onAction</span>=<span class="xml-value">"#handleButtonAction"</span> <span class="xml-tag">/></span>
<span class="xml-tag"><Label</span> <span class="xml-attribute">fx:id</span>=<span class="xml-value">"label"</span> <span class="xml-attribute">translateX</span>=<span class="xml-value">"0"</span> <span class="xml-attribute">translateY</span>=<span class="xml-value">"30"</span> <span class="xml-attribute">text</span>=<span class="xml-value">""</span><span class="xml-tag">/></span>
<span class="xml-tag"></children</span><span class="xml-tag">></span>
<span class="xml-tag"></MyGroup</span> <span class="xml-tag">></span>
</pre><div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;"><span lang="EN-GB" style="font-family: Symbol; mso-ansi-language: EN-GB; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-GB" style="mso-ansi-language: EN-GB;">The Java class which maps the MyGroup's tag in the FXML file and handles the button’s event<o:p></o:p></span></div><table width="100%"><tr><td align="center">MyGroup.java</td></tr></table><pre><span class="keyword-directive">package</span> fxml;
<span class="keyword-directive">import</span> java.net.URL;
<span class="keyword-directive">import</span> java.util.Map;
<span class="keyword-directive">import</span> javafx.event.ActionEvent;
<span class="keyword-directive">import</span> javafx.fxml.Bindable;
<span class="keyword-directive">import</span> javafx.fxml.FXML;
<span class="keyword-directive">import</span> javafx.fxml.Resources;
<span class="keyword-directive">import</span> javafx.scene.Group;
<span class="keyword-directive">import</span> javafx.scene.control.Label;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> MyGroup <span class="keyword-directive">extends</span> Group <span class="keyword-directive">implements</span> Bindable{
@FXML <span class="keyword-directive">private</span> Label label;
@FXML <span class="keyword-directive">private</span> <span class="keyword-directive">void</span> handleButtonAction(ActionEvent event) {
System.out.println(<span class="character">"</span><span class="character">You clicked me!</span><span class="character">"</span>);
label.setText(<span class="character">"</span><span class="character">Hello World !</span><span class="character">"</span>);
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> initialize(Map<String, Object> namespace, URL location, Resources resources) {
}
}
</pre><div class="MsoNormal" style="margin-left: 18.0pt; mso-list: l0 level1 lfo1; text-indent: -18.0pt;"><span lang="EN-GB" style="font-family: Symbol; mso-ansi-language: EN-GB; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-GB" style="mso-ansi-language: EN-GB;">The main class which loads the FXML file, transforms it to JavaFX object graph and adds it in to the scene of the JavaFX application.<o:p></o:p></span></div><table width="100%"><tr><td align="center">TestFXML.java</td></tr></table><pre><span class="keyword-directive">package</span> fxml;
<span class="keyword-directive">import</span> java.io.IOException;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> javafx.fxml.FXMLLoader;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> TestFXML <span class="keyword-directive">extends</span> Application {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> main(String[] args) {
Application.launch(TestFXML.<span class="keyword-directive">class</span>, args);
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> start(Stage primaryStage) {
MyGroup myGroup = <span class="keyword-directive">null</span>;
<span class="keyword-directive">try</span>{
myGroup = (MyGroup) FXMLLoader.load(TestFXML.<span class="keyword-directive">class</span>.getResource(<span class="character">"</span><span class="character">fxml/Screen1.xml</span><span class="character">"</span>));
}<span class="keyword-directive">catch</span> (IOException ioe){
ioe.printStackTrace();
}
primaryStage.setTitle(<span class="character">"</span><span class="character">Test FXML</span><span class="character">"</span>);
primaryStage.setWidth(320);
primaryStage.setHeight(200);
Scene scene = <span class="keyword-directive">new</span> Scene(myGroup);
primaryStage.setScene(scene);
primaryStage.setVisible(<span class="keyword-directive">true</span>);
}
}
</pre><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="mso-ansi-language: EN-US;"><a href="http://pagesperso-orange.fr/paddy.fr/2011/august/FXML-5-08-2011.zip">Get the NetBeans project</a></span></b><span lang="EN-GB" style="mso-ansi-language: EN-GB;"><o:p></o:p></span></div><div class="MsoNormal"><b style="mso-bidi-font-weight: normal;"><br />
</b></div><div class="MsoNormal"><u><span lang="EN-GB">Note:</span></u><span lang="EN-GB"> All that I have coded for this small example is based on: <a href="http://fxexperience.com/2011/07/introducing-fxml/">Introduction FXML</a> from Jonathan Giles<o:p></o:p></span></div><div class="MsoNormal"><a href="http://pagesperso-orange.fr/paddy.fr/2011/august/FXML.zip">original project (August 04, 2011)</a></span><span lang="EN-GB" style="mso-ansi-language: EN-GB;"><o:p></o:p></span></div><br />
Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com2tag:blogger.com,1999:blog-6224595597588014495.post-57653276220866895502011-07-22T22:09:00.004+01:002011-07-22T22:50:40.498+01:00Duke Anim in JavaFX 2.0 (b36)<span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px; line-height: 17px;">This post is just the porting of<a href="http://paddyweblog.blogspot.com/2010/04/duke-anim-in-javafx-13.html"> DukeAnim</a> in JavaFX 2.0 b36.</span><br />
<div class="separator" style="clear: both; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/xcP7ngPMIOM?feature=player_embedded' frameborder='0'></iframe></div><a name='more'></a><br />
<span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;">I tried to have the same structure (UI and Model in different classes) that I had for <a href="http://paddyweblog.blogspot.com/2010/04/duke-anim-in-javafx-13.html">Duke Anim in JavaFX Script</a>. <br />
The only true change is in the code of the event <i style="mso-bidi-font-style: normal;">action</i> for the KeyFrame.<br />
The KeyValue is now immutable and the Set of KeyValues in the KeyFrame is also immutable, so I have to create one new KeyFrame with its news KeyValues, in every event <i style="mso-bidi-font-style: normal;">action</i></span><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;">. </span><br />
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.character {color: #ce7b00}
.keyword-directive {color: #0000e6}
-->
</style><br />
<table width="100%"><tr><td align="center">DukeAnim.java</td></tr></table><pre><span class="keyword-directive">package</span> dukeanim;
<span class="keyword-directive">import</span> javafx.animation.Interpolator;
<span class="keyword-directive">import</span> javafx.animation.KeyFrame;
<span class="keyword-directive">import</span> javafx.animation.KeyValue;
<span class="keyword-directive">import</span> javafx.animation.Timeline;
<span class="keyword-directive">import</span> javafx.application.Application;
<span class="keyword-directive">import</span> javafx.beans.property.IntegerProperty;
<span class="keyword-directive">import</span> javafx.builders.GroupBuilder;
<span class="keyword-directive">import</span> javafx.builders.ImageViewBuilder;
<span class="keyword-directive">import</span> javafx.builders.SceneBuilder;
<span class="keyword-directive">import</span> javafx.builders.TimelineBuilder;
<span class="keyword-directive">import</span> javafx.event.ActionEvent;
<span class="keyword-directive">import</span> javafx.event.EventHandler;
<span class="keyword-directive">import</span> javafx.scene.Scene;
<span class="keyword-directive">import</span> javafx.scene.image.Image;
<span class="keyword-directive">import</span> javafx.scene.image.ImageView;
<span class="keyword-directive">import</span> javafx.stage.Stage;
<span class="keyword-directive">import</span> javafx.util.Duration;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> DukeAnim <span class="keyword-directive">extends</span> Application {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> main(String[] args) {
Application.launch(DukeAnim.<span class="keyword-directive">class</span>, args);
}
@Override
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> start(Stage stage) {
DukeAnimModel dukeAnimModel = <span class="keyword-directive">new</span> DukeAnimModel();
dukeAnimModel.timeline.play();
stage.setTitle(<span class="character">"</span><span class="character">DukeAnim JavaFX 2.0(b36)</span><span class="character">"</span>);
ImageView imageView;
Scene scene = SceneBuilder.create()
.width(240)
.height(320)
.root(GroupBuilder.create()
.children(
imageView = ImageViewBuilder.create()
.image(<span class="keyword-directive">new</span> Image(
DukeAnim.<span class="keyword-directive">class</span>.getResourceAsStream(<span class="character">"</span><span class="character">images/duke.png</span><span class="character">"</span>)
)
)
.build()
)
.build())
.build();
imageView.xProperty().bind(dukeAnimModel.x);
imageView.yProperty().bind(dukeAnimModel.y);
stage.setScene(scene);
stage.setVisible(<span class="keyword-directive">true</span>);
}
}
<span class="keyword-directive">class</span> DukeAnimModel {
<span class="keyword-directive">private</span> EventHandler action = <span class="keyword-directive">new</span> EventHandler<ActionEvent>() {
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> handle(ActionEvent t) {
System.out.println(<span class="character">"</span><span class="character">x : </span><span class="character">"</span> + x);
System.out.println(<span class="character">"</span><span class="character">y : </span><span class="character">"</span> + y);
<span class="keyword-directive">int</span> xTarget = (<span class="keyword-directive">new</span> Double(java.lang.Math.random() * 240 + 1)).intValue();
<span class="keyword-directive">int</span> yTarget = (<span class="keyword-directive">new</span> Double(java.lang.Math.random() * 240 + 1)).intValue();
System.out.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + xTarget);
System.out.println(<span class="character">"</span><span class="character">xTarget : </span><span class="character">"</span> + yTarget);
KeyFrame kf1s = buildKeyFrame(xTarget, yTarget);
timeline.stop();
timeline.getKeyFrames().remove(0);
timeline.getKeyFrames().add(kf1s);
timeline.play();
}
};
<span class="keyword-directive">private</span> KeyFrame buildKeyFrame(<span class="keyword-directive">int</span> xTarget, <span class="keyword-directive">int</span> yTarget) {
Duration t1 = Duration.valueOf(1000);
KeyValue kvx1s = <span class="keyword-directive">new</span> KeyValue(x, xTarget, Interpolator.SPLINE(0, 0.5, 0.5, 1));
KeyValue kvy1s = <span class="keyword-directive">new</span> KeyValue(y, yTarget, Interpolator.SPLINE(0, 0.5, 0.5, 1));
KeyFrame kf1s = <span class="keyword-directive">new</span> KeyFrame(t1, action, kvx1s, kvy1s);
<span class="keyword-directive">return</span> kf1s;
}
<span class="keyword-directive">public</span> IntegerProperty x = <span class="keyword-directive">new</span> IntegerProperty(0);
<span class="keyword-directive">public</span> IntegerProperty y = <span class="keyword-directive">new</span> IntegerProperty(0);
<span class="keyword-directive">public</span> Timeline timeline = TimelineBuilder.create()
.autoReverse(<span class="keyword-directive">true</span>)
.cycleCount(Timeline.INDEFINITE)
.keyFrames(
buildKeyFrame(0,0)
)
.build();
}
</pre><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"><b style="mso-bidi-font-weight: normal;"><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"><a href="http://pagesperso-orange.fr/paddy.fr/2011/dukanimjavafx20b36/DukeAnimJavaFX2.0-b36.zip">Get the NetBeans project</a></span></b><span lang="EN-US" style="font-family: Calibri, sans-serif; font-size: 11pt; line-height: 115%;"> …<br />
Build it and run it!</span></span><br />
<br />
Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-53412634488916410162011-06-22T21:34:00.000+01:002011-06-22T21:34:41.620+01:00Droid Anim – Android 3.0When I wanted to try JavaFX 1.x and more particularly the animations, I wrote <a href="http://paddyweblog.blogspot.com/2009/09/duke-anim-javafx.html">Duke Anim</a>, and <a href="http://paddyweblog.blogspot.com/2010/04/duke-anim-in-javafx-13.html">Duke Anim in JavaFX 1.3</a>.<br />
So when I wanted to try the new animation API in Android 3.0, I wrote Droid Anim.<div style="text-align: left;"><span class="Apple-style-span" style="font-family: 'Times New Roman', serif;"><div class="MsoNormal" style="line-height: 18px;"><span lang="EN-US" style="font-family: "Times New Roman","serif"; font-size: 12.0pt; line-height: 115%; mso-ansi-language: EN-US;"> <br />
</span></div><div class="separator" style="clear: both; line-height: 18px; text-align: center;"><iframe allowfullscreen='allowfullscreen' webkitallowfullscreen='webkitallowfullscreen' mozallowfullscreen='mozallowfullscreen' width='320' height='266' src='https://www.youtube.com/embed/YMpbAfAX1ds?feature=player_embedded' frameborder='0'></iframe></div><a name='more'></a></span></div><div>This little application is pretty simple and shows how to use some part of the new animation API in Android 3.0 <br />
And how to launch the animation and get the width and the height of the View, just after the View becomes visible, by using the View.post method to add an action in the UI message queue and.<br />
</div><div><style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.character {color: #ce7b00}
.keyword-directive {color: #0000e6}
-->
</style><br />
<table width="100%"><tr><td align="center">Anim.java</td></tr></table><pre><span class="keyword-directive">package</span> com.blogspot.paddywebog;
<span class="keyword-directive">import</span> java.util.Random;
<span class="keyword-directive">import</span> android.animation.Animator;
<span class="keyword-directive">import</span> android.animation.ObjectAnimator;
<span class="keyword-directive">import</span> android.animation.ValueAnimator;
<span class="keyword-directive">import</span> android.app.Activity;
<span class="keyword-directive">import</span> android.graphics.Bitmap;
<span class="keyword-directive">import</span> android.graphics.BitmapFactory;
<span class="keyword-directive">import</span> android.os.Bundle;
<span class="keyword-directive">im</span><span class="keyword-directive">port</span> android.view.LayoutInflater;
<span class="keyword-directive">import</span> android.view.View;
<span class="keyword-directive">import</span> android.view.animation.AccelerateDecelerateInterpolator;
<span class="keyword-directive">import</span> android.widget.ImageView;
<span class="keyword-directive">impor</span><span class="keyword-directive">t</span> android.widget.LinearLayout;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> Anim <span class="keyword-directive">extends</span> Activity {
ObjectAnimator xAnim = <span class="keyword-directive">null</span>;
ObjectAnimator yAnim = <span class="keyword-directive">null</span>;
@Override
<span class="keyword-directive">publ</span><span class="keyword-directive">ic</span> <span class="keyword-directive">void</span> onCreate(Bundle savedInstanceState) {
<span class="keyword-directive">super</span>.onCreate(savedInstanceState);
LayoutInflater li = getLayoutInflater();
View v = li.inflate(R.layout.main, <span class="keyword-directive">null</span>);
setContentView(v);
v.post(<span class="keyword-directive">new</span> Runnable() {
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> run() {
ImageView img = (ImageView) findViewById(R.id.imageView1);
Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.android);
img.setImageBitmap(bMap);
Point p = generateNextPoint();
xAnim = ObjectAnimator.ofFloat(img, <span class="character">"</span><span class="character">translationX</span><span class="character">"</span>, 0.f, p.getX());
xAnim.setDuration(3000);
xAnim.setInterpolator(<span class="keyword-directive">new</span> AccelerateDecelerateInterpolator());
xAnim.setRepeatCount(ValueAnimator.INFINITE);
yAnim = ObjectAnimator.ofFloat(img, <span class="character">"</span><span class="character">translationY</span><span class="character">"</span>, 0.f, p.getY());
yAnim.setDuration(3000);
yAnim.setInterpolator(<span class="keyword-directive">new</span> AccelerateDecelerateInterpolator());
yAnim.setRepeatCount(ValueAnimator.INFINITE);
xAnim.addListener(<span class="keyword-directive">new</span> Animator.AnimatorListener() {
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> onAnimationStart(Animator animation) {
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> onAnimationRepeat(Animator animation) {
Point p = generateNextPoint();
Float x = (Float) xAnim.getAnimatedValue();
xAnim.setFloatValues(x, p.getX());
Float y = (Float) yAnim.getAnimatedValue();
yAnim.setFloatValues(y, p.getY());
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> onAnimationCancel(Animator animation) {
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> onAnimationEnd(Animator animation) {
}
});
xAnim.start();
yAnim.start();
}
});
}
<span class="keyword-directive">public</span> Point generateNextPoint() {
Bitmap bMap = BitmapFactory.decodeResource(getResources(), R.drawable.android);
LinearLayout layout = (LinearLayout) findViewById(R.id.linearLayout1);
<span class="keyword-directive">int</span> lWidth = layout.getWidth();
<span class="keyword-directive">int</span> lHeight = layout.getHeight();
<span class="keyword-directive">int</span> width = lWidth - bMap.getWidth();
<span class="keyword-directive">int</span> height = lHeight - bMap.getHeight();
Random generator = <span class="keyword-directive">new</span> Random();
Float xTarget = (generator.nextFloat() * width + 1);
Float yTarget = (generator.nextFloat() * height + 1);
<span class="keyword-directive">return</span> <span class="keyword-directive">new</span> Point(xTarget, yTarget);
}
}
<span class="keyword-directive">class</span> Point {
<span class="keyword-directive">private</span> Float x;
<span class="keyword-directive">private</span> Float y;
Point(Float x, Float y) {
<span class="keyword-directive">this</span>.x = x;
<span class="keyword-directive">thi</span><span class="keyword-directive">s</span>.y = y;
}
<span class="keyword-directive">public</span> Float getX() {
<span class="keyword-directive">return</span> x;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setX(Float x) {
<span class="keyword-directive">this</span>.x = x;
}
<span class="keyword-directive">public</span> Float getY() {
<span class="keyword-directive">return</span> y;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setY(Float y) {
<span class="keyword-directive">this</span>.y = y;
}
<span class="keyword-directive">public</span> String toString() {
StringBuilder sb = <span class="keyword-directive">new</span> StringBuilder();
sb.append(<span class="character">"</span><span class="character">x = </span><span class="character">"</span>);
sb.append(x);
sb.append(<span class="character">"</span><span class="character"> ; y = </span><span class="character">"</span>);
sb.append(y);
<span class="keyword-directive">return</span> sb.toString();
}
}
</pre></div><div><b><a href="https://github.com/patrickchampion/DroidAnim"> The source code, usable with eclipse, is available on github</a>.</b></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-17222205680875304512011-05-26T17:51:00.002+01:002011-05-27T17:46:57.151+01:00JavaFX 2.0 Beta is there!<div class="MsoNormal"></div><div class="MsoNormal"><span lang="EN-US">JavaFX 2.0 Beta has been released, but only for Windows* :( <br />
</span><span lang="EN-US"><a href="http://www.oracle.com/technetwork/java/javafx/overview/index.html">http://www.oracle.com/technetwork/java/javafx/overview/index.html</a></span><span lang="EN-US"><o:p></o:p></span></div><div class="MsoNormal">For download it:<br />
<span lang="EN-US"><a href="http://www.oracle.com/technetwork/java/javafx/downloads/index-jsp-136193.html">http://www.oracle.com/technetwork/java/javafx/downloads/index-jsp-136193.html</a></span><br />
<br />
<br />
<div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">*<u>Update 9 may 2011</u>: JavaFX will be cross platform - Richard Bair<br />
</span><a href="http://fxexperience.com/2011/05/is-javafx-2-0-cross-platform/"><span lang="EN-US" style="mso-ansi-language: EN-US;">http://fxexperience.com/2011/05/is-javafx-2-0-cross-platform/</span></a><span lang="EN-US" style="mso-ansi-language: EN-US;"><o:p></o:p></span></div></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-70836346490637380212011-05-26T10:22:00.000+01:002011-05-26T10:22:00.150+01:00The documentation of the JavaFX 2.0 Beta is there<div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">Even if JavaFX 2.0 Beta isn’t out yet, the documentation is already there<br />
</span><a href="http://download.oracle.com/javafx/index.html"><span lang="EN-US" style="mso-ansi-language: EN-US;">http://download.oracle.com/javafx/index.html</span></a><span lang="EN-US" style="mso-ansi-language: EN-US;"><o:p></o:p></span></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-81777012582145838052011-02-09T22:24:00.006+01:002011-02-09T22:36:21.548+01:00JavaFX 2.0 Early Access and Beta Program<div lang="en-US" style="margin-bottom: 0cm;">JavaFX 2.0 Early Access is available for the JavaFX Partners, the JUG Leaders, and the Java Champions. </div><div lang="en-US" style="margin-bottom: 0cm;">I'm not a JavaFX Partner, nor a JUG Leader or a Java Champion (even with my last name ;) ), but in the <a href="http://www.oracle.com/dm/11q1field/javafx_beta_en.html">form to sign up to participate in the Early Access and Beta program</a> there is an item "Other".</div><div lang="en-US" style="margin-bottom: 0cm;"><br />
</div><div style="margin-bottom: 0cm;"><span lang="en-US">So, because i'm a JavaFX enthusiast</span><span style="color: #333333;"><span style="font-family: 'Times New Roman', serif;"><span style="font-size: small;"><span lang="en-US"><span style="font-style: normal;"><span style="font-weight: normal;">, </span></span></span></span></span></span><span lang="en-US">I signed up as "Other" …</span></div><div lang="en-US" style="margin-bottom: 0cm;">And may be, with a little luck, I could have an access to the Early Access and Beta Program !</div><div class="separator" style="clear: both; text-align: center;"></div><div lang="en-US" style="margin-bottom: 0cm;"><br />
</div><div class="separator" style="clear: both; text-align: center;"><a href="http://4.bp.blogspot.com/_rpz_ucpdDqg/TVMCItbI71I/AAAAAAAAAJc/PkM-ckX91_s/s1600/JavaFX+2.0+EA+and+Beta.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" height="213" src="http://4.bp.blogspot.com/_rpz_ucpdDqg/TVMCItbI71I/AAAAAAAAAJc/PkM-ckX91_s/s320/JavaFX+2.0+EA+and+Beta.png" width="320" /></a></div><div lang="en-US" style="margin-bottom: 0cm;"><br />
</div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com2tag:blogger.com,1999:blog-6224595597588014495.post-85520646923910277972010-12-12T22:41:00.004+01:002010-12-12T23:44:55.745+01:00Some tips for newbies developers on Android 2.2 (like me)<div style="margin-bottom: 0cm;">The tips are :</div><ul><li><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">Know the devices which are connected</div></li>
<li><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">Deploy your application on real devices</div></li>
<li><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">Deploy your application on SD Card</div></li>
<li><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">Know the location (internal or SD Card) of your application and move it or stop it</div></li>
</ul><div style="margin-bottom: 0cm;"><u><b></b></u></div><a name='more'></a><u><b>Know the devices which are connected</b></u><br />
<div style="margin-bottom: 0cm;"></div><ul><li>On your computer, open the terminal (command prompt on windows) and launch the command:<br />
<i>android-sdk</i>/tools/adb devices</li>
</ul><u><b>Deploy your application on real devices</b></u><br />
<ul><li>Stop your Android emulator<br />
<br />
</li>
<li>Connect your Android device to your computer with an USB cable<br />
(on Windows, may be you should install <a href="http://developer.android.com/sdk/win-usb.html">USB driver for adb</a>. Me, I use a Mac ;) )<br />
<br />
</li>
<li>On your Android device, enable USB debugging<br />
<span style="font-weight: normal;">Settings>Applications>Development>USB debugging<br />
<br />
</span></li>
<li>On your computer, open the terminal (command prompt on windows) and launch the command:<br />
<i>android-sdk</i>/tools/adb install <i>path</i>/<i>file.apk<br />
</i><br />
Where <i>path</i> is the path of your application packaged in APK and <i>file</i> is the name of your APK file.</li>
</ul><ul><li>Your application is installed!</li>
</ul><u><b>Deploy your application on SD Card</b></u><br />
<ul><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">The procedure to deploy your application on SD Card, instead of Internal memory, is pretty similar to the procedure above.</div><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">You have just to :</div><ol><ul><li><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">add the <i>android:installLocation</i> attribute with the value <i>auto</i> in the AndroidManifest.xml file.</div><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;"><span style="font-size: x-small;"><span style="color: teal;"><span style="font-family: Monaco, monospace;"><</span></span><span style="color: #3f7f7f;"><span style="font-family: Monaco, monospace;">manifest</span></span><span style="font-family: Monaco, monospace;"> </span><span style="color: #7f007f;"><span style="font-family: Monaco, monospace;">xmlns:android</span></span><span style="color: black;"><span style="font-family: Monaco, monospace;">=</span></span><span style="color: #2a00ff;"><span style="font-family: Monaco, monospace;"><i>"http://schemas.android.com/apk/res/android"<br />
</i></span></span></span><span style="color: #7f007f;"><span style="font-family: Monaco, monospace;"><span style="font-size: x-small;">android:installLocation</span></span></span><span style="color: black;"><span style="font-family: Monaco, monospace;"><span style="font-size: x-small;">=</span></span></span><span style="color: #2a00ff;"><span style="font-family: Monaco, monospace;"><span style="font-size: x-small;"><i>"auto"<br />
</i></span></span></span><i><span style="text-decoration: none;"><span style="font-weight: normal;"><span class="Apple-style-span" style="color: #2a00ff;"><span class="Apple-style-span" style="font-family: Monaco, monospace; font-size: x-small;">...</span></span></span></span></i></div><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;"><i><span style="text-decoration: none;"><span style="font-weight: normal;"><span class="Apple-style-span" style="color: #2a00ff;"><span class="Apple-style-span" style="font-family: Monaco, monospace; font-size: x-small;"><br />
</span></span></span></span></i>For more informations on this attribute, read : <a href="http://developer.android.com/guide/appendix/install-location.html"><span id="goog_133990556"></span>App Install Location<span id="goog_133990557"></span></a></div></li>
</ul></ol></ul><ul><ol><ul><li><div style="margin-bottom: 0cm;"><span style="text-decoration: none;"><span style="font-weight: normal;">deploy your application with the command:<br />
adb install -s </span></span><i><span style="text-decoration: none;"><span style="font-weight: normal;">path</span></span></i><span style="text-decoration: none;"><span style="font-weight: normal;">/</span></span><i><span style="text-decoration: none;"><span style="font-weight: normal;">file.apk</span></span></i><span style="text-decoration: none;"><span style="font-weight: normal;"> </span></span> </div><div style="margin-bottom: 0cm;"></div></li>
</ul></ol></ul><div style="margin-bottom: 0cm;"><u><b>Know the location (internal or SD Card) of your application and move it or stop it</b></u></div><ul><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">Knowing the location of an application is very easy on Android 2.2.</div><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">On your Android device go to: Manage applications</div><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">Settings>Applications>Manage applications</div></ul><ul><div style="font-weight: normal; margin-bottom: 0cm; text-decoration: none;">And if you select an application, you can move this application (if it's possible) to the SD Card or to the internal memory of your device.</div><div style="margin-bottom: 0cm;"><span style="text-decoration: none;"><span style="font-weight: normal;">You can even force stop of this appl</span></span>ication </div></ul>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-50797368283181672202010-11-11T01:04:00.008+01:002010-11-11T01:11:03.002+01:00RESTful client in JavaScript<div class="separator" style="clear: both; text-align: center;"></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">In the line of my posts regarding consumption of JSON RESTful services in different technologies (<a href="http://paddyweblog.blogspot.com/2010/08/restful-client-in-javafx.html">JavaFX</a>, <a href="http://paddyweblog.blogspot.com/2010/10/restful-client-in-java.html">Java</a>), I wrote a small client in JavaScript.<br />
As in my previous posts, I use the RESTful service described in <a href="http://paddyweblog.blogspot.com/2010/07/restful-service-with-jax-rs-and-jpa-2.html">RESTful service with JAX-RS (and JPA 2 for the access to the data</a>.</span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://2.bp.blogspot.com/_rpz_ucpdDqg/TNsmdzgaQaI/AAAAAAAAAI8/3v-zJXoPgng/s1600/restfulclient-javascript.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://2.bp.blogspot.com/_rpz_ucpdDqg/TNsmdzgaQaI/AAAAAAAAAI8/3v-zJXoPgng/s1600/restfulclient-javascript.png" /></a></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;"> </span></div><a name='more'></a>Write a Restful client in JavaScript is relatively easy. <br />
First you have to use Ajax to call the Restful service<br />
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.sgml-comment {color: #969696}
.argument {color: #009900}
.value {color: #ce7b00}
.tag {color: #0000e6}
-->
</style><br />
<pre> <span class="tag">var</span> req = <span class="tag">null</span>;
<span class="tag">if</span> (begining.length==0){
document.getElementById(<span class="value">"</span><span class="value">result</span><span class="value">"</span>).innerHTML=<span class="value">"</span><span class="value">"</span>;
<span class="tag">return</span>;
}
<span class="tag">if</span> (window.XMLHttpRequest){
req =<span class="tag">new</span> XMLHttpRequest();
}
<span class="tag">else</span> {
req = <span class="tag">new</span> ActiveXObject(<span class="value">"</span><span class="value">Microsoft.XMLHTTP</span><span class="value">"</span>);
}
<span class="sgml-comment">// </span><span class="sgml-comment">var</span> <span class="sgml-comment">url</span><span class="sgml-comment">="</span><span class="sgml-comment">http</span><span class="sgml-comment">://</span><span class="sgml-comment">localhost</span><span class="sgml-comment">:8080/</span><span class="sgml-comment">RESTfulServices</span><span class="sgml-comment">/</span><span class="sgml-comment">rs</span><span class="sgml-comment">/</span><span class="sgml-comment">ArtisteNameBeginningBy</span><span class="sgml-comment">/" + </span><span class="sgml-comment">begining</span><span class="sgml-comment">;</span>
<span class="tag">var</span> url=<span class="value">"</span><span class="value">http://192.168.1.17:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="value">"</span> + begining;
req.onreadystatechange = <span class="tag">function</span> () {
<span class="tag">if</span> (req.readyState == 4 && req.status == 200) {
<span class="sgml-comment">// </span><span class="sgml-comment">do</span> <span class="sgml-comment">something</span> <span class="sgml-comment">with</span> <span class="sgml-comment">the</span> <span class="sgml-comment">results</span>
} <span class="tag">else</span> {
<span class="sgml-comment">// </span><span class="sgml-comment">wait</span> <span class="sgml-comment">for</span> <span class="sgml-comment">the</span> <span class="sgml-comment">call</span> <span class="sgml-comment">to</span> <span class="sgml-comment">complete</span>
}
}
req.open(<span class="value">"</span><span class="value">GET</span><span class="value">"</span>,url,<span class="tag">true</span>);
req.send(<span class="tag">null</span>);
}
</pre>Then, because JSON is a subset of the object literal notation of JavaScript, you only have to use the eval() function to convert a JSON text to a JavaScript object.<br />
<pre><span class="tag">var</span> ret = eval (<span class="value">'</span><span class="value">(</span><span class="value">'</span>+req.responseText+<span class="value">'</span><span class="value">)</span><span class="value">'</span>);</pre>And finally, do something with the result.<br />
In my case, the writeResult() function is used to dynamically display the result in a html table.<br />
<o:p></o:p><br />
<div class="MsoNormal"><u><span lang="EN-US" style="mso-ansi-language: EN-US;">full source code of the example<br />
</span></u><br />
<table width="100%"><tr><td align="center">restfulClient.html</td></tr>
</table><pre><span class="tag"><</span><span class="tag">htlm</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">script</span> <span class="argument">type</span><span class="argument">=</span><span class="value">"text/javascript"</span><span class="tag">></span>
<span class="tag">function</span> getArtisteNameBeginningBy(begining){
<span class="tag">var</span> req = <span class="tag">null</span>;
<span class="tag">if</span> (begining.length==0){
document.getElementById(<span class="value">"</span><span class="value">result</span><span class="value">"</span>).innerHTML=<span class="value">"</span><span class="value">"</span>;
<span class="tag">return</span>;
}
<span class="tag">if</span> (window.XMLHttpRequest){
req =<span class="tag">new</span> XMLHttpRequest();
}
<span class="tag">else</span> {
req = <span class="tag">new</span> ActiveXObject(<span class="value">"</span><span class="value">Microsoft.XMLHTTP</span><span class="value">"</span>);
}
<span class="sgml-comment">// </span><span class="sgml-comment">var</span> <span class="sgml-comment">url</span><span class="sgml-comment">="</span><span class="sgml-comment">http</span><span class="sgml-comment">://</span><span class="sgml-comment">localhost</span><span class="sgml-comment">:8080/</span><span class="sgml-comment">RESTfulServices</span><span class="sgml-comment">/</span><span class="sgml-comment">rs</span><span class="sgml-comment">/</span><span class="sgml-comment">ArtisteNameBeginningBy</span><span class="sgml-comment">/" + </span><span class="sgml-comment">begining</span><span class="sgml-comment">;</span>
<span class="tag">var</span> url=<span class="value">"</span><span class="value">http://192.168.1.17:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span><span class="value">"</span> + begining;
req.onreadystatechange = <span class="tag">function</span> () {
<span class="tag">if</span> (req.readyState == 4 && req.status == 200) {
<span class="tag">var</span> ret = eval (<span class="value">'</span><span class="value">(</span><span class="value">'</span>+req.responseText+<span class="value">'</span><span class="value">)</span><span class="value">'</span>);
writeResult(ret);
} <span class="tag">else</span> {
<span class="sgml-comment">// </span><span class="sgml-comment">wait</span> <span class="sgml-comment">for</span> <span class="sgml-comment">the</span> <span class="sgml-comment">call</span> <span class="sgml-comment">to</span> <span class="sgml-comment">complete</span>
}
}
req.open(<span class="value">"</span><span class="value">GET</span><span class="value">"</span>,url,<span class="tag">true</span>);
req.send(<span class="tag">null</span>);
}
<span class="tag">function</span> writeResult(ret){
<span class="tag">var</span> tableRes = document.getElementById(<span class="value">"</span><span class="value">tableRes</span><span class="value">"</span>);
<span class="tag">if</span> (tableRes!=<span class="tag">null</span>){
document.getElementById(<span class="value">"</span><span class="value">result</span><span class="value">"</span>).removeChild(tableRes);
}
<span class="tag">if</span> (ret!=<span class="tag">null</span>){
<span class="tag">var</span> table = document.createElement(<span class="value">"</span><span class="value">table</span><span class="value">"</span>);
table.border = 1;
table.id = <span class="value">"</span><span class="value">tableRes</span><span class="value">"</span>;
<span class="tag">for</span> (i=0;i<ret.music.length;i++){
<span class="tag">var</span> id = ret.music[i].id;
<span class="tag">var</span> artisteName = ret.music[i].artisteName;
<span class="tag">var</span> albumTitle = ret.music[i].albumTitle;
<span class="tag">var</span> row = table.insertRow(i);
<span class="tag">var</span> cell1 = row.insertCell(0);
<span class="tag">var</span> valueCell1 = document.createTextNode(id);
cell1.appendChild(valueCell1);
<span class="tag">var</span> cell2 = row.insertCell(1);
<span class="tag">var</span> valueCell2 = document.createTextNode(artisteName);
cell2.appendChild(valueCell2);
<span class="tag">var</span> cell3 = row.insertCell(2);
<span class="tag">var</span> valueCell3 = document.createTextNode(albumTitle);
cell3.appendChild(valueCell3);
}
document.getElementById(<span class="value">"</span><span class="value">res</span><span class="value">ult</span><span class="value">"</span>).appendChild(table);
}
}
<span class="tag"></</span><span class="tag">script</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">head</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">body</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">input</span> <span class="argument">type</span><span class="argument">=</span><span class="value">"text"</span> <span class="argument">id</span><span class="argument">=</span><span class="value">"</span>searchTextBox<span class="value">"</span> <span class="argument">onkey</span><span class="argument">up</span><span class="argument">=</span><span class="value">"</span>getArtisteNameBeginningBy(<span class="tag">this</span>.value)<span class="value">"</span><span class="tag">></span><span class="tag"></</span><span class="tag">input</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">p</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">span</span> <span class="argument">id</span><span class="argument">=</span><span class="value">"</span>result<span class="value">"</span><span class="tag">></span><span class="tag"></</span><span class="tag">span</span><span class="tag">></span>
<span class="tag"><</span><span class="tag">p</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">boby</span><span class="tag">></span>
<span class="tag"></</span><span class="tag">html</span><span class="tag">></span>
</pre><span lang="EN-US" style="mso-ansi-language: EN-US;"><o:p></o:p></span></div><div class="MsoNormal"><b><span lang="EN-US" style="color: #336699; font-family: "Verdana","sans-serif"; font-size: 10.0pt; line-height: 115%; mso-ansi-language: EN-US;"><a href="http://pagesperso-orange.fr/paddy.fr%20/2010/november/javascriptrestfulclient/RestAjax.zip">Get the NetBeans project</a></span></b><span lang="EN-US" style="mso-ansi-language: EN-US;"><o:p></o:p></span></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com2tag:blogger.com,1999:blog-6224595597588014495.post-10676554169607386702010-10-10T16:52:00.004+01:002010-10-10T16:57:26.621+01:00RESTful client in Java<div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">Because JavaFX 2.0 will be a Java API, we shall have to use Java (or Groovy, Scala, JRuby,etc ... but this isn't the purpose <span style="mso-spacerun: yes;"> </span>of this post) instead of JavaFX Script for use it.<br />
And because, the news UIs creates with JavaFX 2.0 will have to consume RESTtful JSON services, I wrote a small RESTful client in Java.<br />
To do that, I use the JAXB's implementation for JSON from </span><span lang="EN-US"><a href="https://jersey.dev.java.net/">Jersey</a></span><span lang="EN-US" style="mso-ansi-language: EN-US;"> and for the RESTful service to be consume, the RESTful service wrote in an old post:<span style="mso-spacerun: yes;"> </span><a href="http://paddyweblog.blogspot.com/2010/07/restful-service-with-jax-rs-and-jpa-2.html">RESTful service with JAX-RS (and JPA 2 for the access to the data)</a></span></div><a name='more'></a><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">If I compare with </span><span lang="EN-US"><a href="http://paddyweblog.blogspot.com/2010/08/restful-client-in-javafx.html">the client that I had written in JavaFX Script</a></span><span lang="EN-US" style="mso-ansi-language: EN-US;">, it's easier to write a RESTFul client in Java/Jersey than in JavaFX Script because we don't have to write a parser (JavaFX' PullParser).<br />
But, in Java, the beans are more verbose… (getter and setter)<o:p></o:p></span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">Let's go for the code!<o:p></o:p></span></div><div class="MsoNormal" style="margin-bottom: .0001pt; margin-bottom: 0cm;"><span lang="EN-US" style="mso-ansi-language: EN-US;">We have 2 Beans:</span></div><div class="MsoNormal" style="line-height: normal; margin-bottom: .0001pt; margin-bottom: 0cm;"></div><ul><li>ListMusic, which maps the JSON array which is returned when calling the RESTful service.</li>
<li>Music, which maps one element of the JSON array</li>
</ul>And the RestfulClient wich calls the RESTful service and parses the JSON result with Jersey.<br />
<div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;"> <br />
<style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.ST0 {color: #ce7b00; font-family: Monospaced; font-weight: bold}
.character {color: #ce7b00}
.keyword-directive {color: #0000e6}
-->
</style><br />
<table width="100%"><tr><td align="center">RestfulClient.java</td></tr>
</table><pre><span class="keyword-directive">package</span> restfulclient;
<span class="keyword-directive">import</span> com.sun.jersey.api.json.JSONJAXBContext;
<span class="keyword-directive">import</span> com.sun.jersey.api.json.JSONUnmarshaller;
<span class="keyword-directive">import</span> java.io.InputStream;
<span class="keyword-directive">im</span><span class="keyword-directive">port</span> java.net.HttpURLConnection;
<span class="keyword-directive">import</span> java.net.URL;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> RestfulClient {
<span class="keyword-directive">public</span> <span class="keyword-directive">static</span> <span class="keyword-directive">void</span> main(String[] args) {
<span class="keyword-directive">try</span> {
URL url = <span class="keyword-directive">new</span> URL(<span class="character">"</span><span class="character">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/Arc</span><span class="character">"</span>);
HttpURLConnection connection = (HttpURLConnection)url.openConnection();
connection.setRequestMethod(<span class="character">"</span><span class="character">GET</span><span class="character">"</span>);
connection.connect();
InputStream responseStream = connection.getInputStream();
JSONJAXBContext jc = <span class="keyword-directive">new</span> JSONJAXBContext(ListMusic.<span class="keyword-directive">class</span>);
JSONUnmarshaller u = jc.createJSONUnmarshaller();
ListMusic m = u.unmarshalFromJSON(responseStream,ListMusic.<span class="keyword-directive">class</span>);
connection.disconnect();
System.out.println(m.getMusic());
}
<span class="keyword-directive">catch</span>(java.net.MalformedURLException mue){
mue.printStackTrace();
}
<span class="keyword-directive">catch</span>(java.io.IOException ioe){
ioe.printStackTrace();
}
<span class="keyword-directive">catch</span>(javax.xml.bind.JAXBException jaxbe){
jaxbe.printStackTrace();
}
}
}
</pre><table width="100%"><tr><td align="center">ListMusic.java</td></tr>
</table><pre><span class="keyword-directive">package</span> restfulclient;
<span class="keyword-directive">import</span> java.util.ArrayList;
<span class="keyword-directive">import</span> java.util.List;
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> ListMusic {
List<Music> music = <span class="keyword-directive">new</span> ArrayList();
<span class="keyword-directive">pub</span><span class="keyword-directive">lic</span> List<Music> getMusic() {
<span class="keyword-directive">return</span> music;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setMusic(List<Music> music) {
<span class="keyword-directive">this</span>.music = music;
}
}
</pre><table width="100%"><tr><td align="center">Music.java</td></tr>
</table><pre><span class="keyword-directive">package</span> restfulclient;
<span class="keyword-directive">import</span> java.io.Serializable;
<span class="keyword-directive">import</span> javax.xml.bind.annotation.XmlRootElement;
@XmlRootElement
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> Music <span class="keyword-directive">implements</span> Serializable {
<span class="keyword-directive">private</span> Long id;
<span class="keyword-directive">private</span> String artisteName;
<span class="keyword-directive">private</span> String albumTitle;
<span class="keyword-directive">public</span> Music() {
}
<span class="keyword-directive">public</span> String getAlbumTitle() {
<span class="keyword-directive">return</span> albumTitle;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setAlbumTitle(String albumTitle) {
<span class="keyword-directive">this</span>.albumTitle = albumTitle;
}
<span class="keyword-directive">public</span> String getArtisteName() {
<span class="keyword-directive">return</span> artisteName;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setArtisteName(String artisteName) {
<span class="keyword-directive">this</span>.artisteName = artisteName;
}
<span class="keyword-directive">public</span> Long getId() {
<span class="keyword-directive">return</span> id;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setId(Long id) {
<span class="keyword-directive">this</span>.id = id;
}
@Override
<span class="keyword-directive">public</span> String toString(){
StringBuilder sb = <span class="keyword-directive">new</span> StringBuilder();
sb.append(<span class="character">"</span><span class="character">id : </span><span class="character">"</span>);sb.append(id);sb.append(<span class="character">"</span><span class="character"> ; </span><span class="character">"</span>);
sb.append(<span class="character">"</span><span class="character">artisteName : </span><span class="character">"</span>);sb.append(artisteName);sb.append(<span class="character">"</span><span class="character"> ; </span><span class="character">"</span>);
sb.append(<span class="character">"</span><span class="character">albumTitle : </span><span class="character">"</span>);sb.append(albumTitle);
sb.append(<span class="character">"</span> <span class="ST0">\n</span><span class="character">"</span>);
<span class="keyword-directive">return</span> sb.toString();
}
}
</pre><o:p></o:p></span></div><div class="MsoNormal"><span class="apple-style-span"><b><span lang="EN-US" style="color: black; font-family: "Verdana","sans-serif"; font-size: 10.0pt; line-height: 115%; mso-ansi-language: EN-US;"><span style="color: #336699;"><a href="http://pagesperso-orange.fr/paddy.fr/october/restfulclient/RestfulClient.zip">Get the NetBeans project</a></span></span></b></span><b></b><span lang="EN-US" style="mso-ansi-language: EN-US;"><o:p></o:p></span></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-19530908873319335832010-09-23T21:36:00.002+01:002010-09-24T07:31:46.558+01:00JavaFX 2.0 rebooted, round up of the links<div class="MsoNormal"><span lang="EN-US">The roadmap: <a href="http://javafx.com/roadmap/">http://javafx.com/roadmap/</a></span></div><div class="MsoNormal"><span lang="EN-US"> Richard Blair: <a href="http://fxexperience.com/2010/09/javafx-2-0/">http://fxexperience.com/2010/09/javafx-2-0/</a></span></div><div class="MsoNormal"><span lang="EN-US"> Amy Fowler: <a href="http://amyfowlersblog.wordpress.com/2010/09/21/a-heartfelt-ramble-on-swing-javafx/">http://amyfowlersblog.wordpress.com/2010/09/21/a-heartfelt-ramble-on-swing-javafx/</a></span></div><div class="MsoNormal"><span lang="EN-US"> Osvaldo Pinali Doederlein: <a href="http://weblogs.java.net/blog/opinali/archive/2010/09/23/swing-20-coming">http://weblogs.java.net/blog/opinali/archive/2010/09/23/swing-20-coming</a></span></div><div class="MsoNormal"><span lang="EN-US"> Stephen Chin : <a href="http://steveonjava.com/javafx-2-0/">http://steveonjava.com/javafx-2-0/</a></span></div><div class="MsoNormal"><span lang="EN-US"> Jonathan Giles :</span><span class="apple-style-span"><span lang="EN-US" style="color: #666666; font-family: 'Lucida Sans Unicode', sans-serif; font-size: 7.5pt; line-height: 115%;"> </span></span><a href="http://jonathangiles.net/blog/?p=916"><span lang="EN-US">http://jonathangiles.net/blog/?p=916</span></a><span lang="EN-US"><br />
<br />
Oracle Press Release: <a href="http://www.oracle.com/us/corporate/press/173728">http://www.oracle.com/us/corporate/press/173728</a><o:p></o:p></span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://lh5.ggpht.com/_rpz_ucpdDqg/TJu5X7pWLnI/AAAAAAAAAIc/m0vi1lsJf6Q/javaclientarchitecture.jpg" imageanchor="1" style="clear: left; float: left; margin-bottom: 1em; margin-right: 1em;"><img border="0" height="292" src="http://lh5.ggpht.com/_rpz_ucpdDqg/TJu5X7pWLnI/AAAAAAAAAIc/m0vi1lsJf6Q/javaclientarchitecture.jpg" width="640" /></a></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><br />
</div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-11213052485004967532010-09-01T23:47:00.000+01:002010-09-01T23:47:05.874+01:00Arcade Fire, Html 5, Google Chrome Experiment<div class="MsoNormal"><span lang="EN-US">It’s not because I’m a big fan of <a href="http://www.arcadefire.com/">Arcade Fire</a> (Great Show at <a href="http://www.rockenseine.com/en/lineup/">Rock en Seine</a>, even under the rain) that I speak you of their last "clip", but I think it's a great demo of what we can make with html 5.<o:p></o:p></span></div><div class="MsoNormal"><span lang="EN-US">The "clip" of: We used to wait<br />
</span><a href="http://www.thewildernessdowntown.com/"><span lang="EN-US">http://www.thewildernessdowntown.com/</span></a><span lang="EN-US"><o:p></o:p></span></div><div class="MsoNormal"><span lang="EN-US">And the making of <br />
</span><a href="http://www.chromeexperiments.com/arcadefire/"><span lang="EN-US">http://www.chromeexperiments.com/arcadefire/</span></a></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-52012587652469091652010-08-01T15:41:00.001+01:002010-08-01T15:44:02.516+01:00RESTful client in JavaFX<div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">In this second part, we are going to create a small application in JavaFX to call the restful service created in the</span><span lang="EN-US"> <a href="http://paddyweblog.blogspot.com/2010/07/restful-service-with-jax-rs-and-jpa-2.html">first part</a></span><span lang="EN-US" style="mso-ansi-language: EN-US;">.<o:p></o:p></span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">This small application is the same as the one created in an older post : </span><span lang="EN-US"><a href="http://paddyweblog.blogspot.com/2010/03/javafx-and-jpa-20-with-my-custom.html">JavaFX and JPA 2.0 with my custom component</a></span><span lang="EN-US" style="mso-ansi-language: EN-US;">, but instead of call directly the database with the help of an entity, we are going to call the restful service.<o:p></o:p></span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://lh4.ggpht.com/_rpz_ucpdDqg/TFV-nggseYI/AAAAAAAAAH8/AKOS6vYVA5k/applicationRestful.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://lh4.ggpht.com/_rpz_ucpdDqg/TFV-nggseYI/AAAAAAAAAH8/AKOS6vYVA5k/applicationRestful.png" /></a></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">To create this application, we are going to create :<o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 39.0pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="mso-ansi-language: EN-US;">a Music JavaFX Bean as model<o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 39.0pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="mso-ansi-language: EN-US;">a client to the RESTFul services (and its JSON parser) <o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 39.0pt; mso-list: l0 level1 lfo1; tab-stops: list 39.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="mso-ansi-language: EN-US;">an JavaFX User Interface<o:p></o:p></span></div><a name='more'></a><br />
<div class="MsoNormal"><b><u><span lang="EN-US" style="mso-ansi-language: EN-US;">The model<o:p></o:p></span></u></b></div><div class="MsoNormal"></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">The model is a simple JavaFX Bean which maps one element of the JSON array which is returned when we call the RESTful service<o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 36.0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="mso-ansi-language: EN-US;">An example of the JSON result when you call the service with: <i>Arc</i> as parameter<o:p></o:p></span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://lh6.ggpht.com/_rpz_ucpdDqg/TFV-nmqSnMI/AAAAAAAAAIA/Vm8ETXOGa_g/resultjson.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://lh6.ggpht.com/_rpz_ucpdDqg/TFV-nmqSnMI/AAAAAAAAAIA/Vm8ETXOGa_g/resultjson.png" /></a></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;"><span style="mso-tab-count: 1;"> </span></span></div><div class="MsoNormal" style="margin-left: 36.0pt; mso-list: l0 level1 lfo1; tab-stops: list 36.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="mso-ansi-language: EN-US;">the Music JavaFX Bean </span></div><style type="text/css">
<!--
body {color: #000000; background-color: #ffffff; font-family: Monospaced}
pre {color: #000000; background-color: #ffffff; font-family: Monospaced}
table {color: #000000; background-color: #e9e8e2; font-family: Monospaced}
.comment {color: #969696}
.string {color: #ce7b00}
.keyword {color: #0000e6}
.ST0 {color: #0000e6; font-family: Monospaced; font-weight: bold}
-->
</style><br />
<div class="MsoNormal" style="margin-left: 35.45pt;"><table width="100%"><tr><td align="center">Music.fx</td></tr>
</table><pre><span class="keyword">package</span> model;
<span class="keyword">public</span> <span class="keyword">class</span> Music {
<span class="keyword">public</span> <span class="keyword">var</span> id: Long;
<span class="keyword">public</span> <span class="keyword">var</span> artisteName: String;
<span class="keyword">public</span> <span class="keyword">var</span> albumTitle: String;
<span class="keyword">overr</span><span class="keyword">ide</span> <span class="keyword">public</span> <span class="keyword">function</span> toString():String {
<span class="ST0">return</span> <span class="string">"</span><span class="string">id: </span>{id}<span class="string"> ,artisteName: </span>{artisteName}<span class="string"> ,albumTitle: </span>{albumTitle}<span class="string">"</span>
}
}</pre></div><div class="MsoNormal"><b><u><span lang="EN-US" style="mso-ansi-language: EN-US;">The Client<o:p></o:p></span></u></b></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">Now, let's write the client.<o:p></o:p></span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">The client is composed of 2 methods:<o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 36.0pt; mso-list: l2 level1 lfo3; tab-stops: list 36.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><i><span lang="EN-US" style="mso-ansi-language: EN-US;">getArtisteNameBeginningBy</span></i><span lang="EN-US" style="mso-ansi-language: EN-US;">, which calls the RESTful service by using the JavaFX's</span><span lang="EN-US"><a href="http://java.sun.com/javafx/1.3/docs/api/javafx.io.http/javafx.io.http.HttpRequest.html"> HttpRequest class</a></span></div><div class="MsoNormal" style="margin-left: 36.0pt; mso-list: l2 level1 lfo3; tab-stops: list 36.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: Symbol; mso-ansi-language: EN-US; mso-bidi-font-family: Symbol; mso-fareast-font-family: Symbol;"><span style="mso-list: Ignore;">·<span style="font: 7.0pt "Times New Roman";"> </span></span></span><i><span lang="EN-US" style="mso-ansi-language: EN-US;">parse</span></i><span lang="EN-US" style="mso-ansi-language: EN-US;">, which parses the JSON flux. This method is called by the <i>onInput</i> callback of the HttpRequest class.<o:p></o:p></span></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">The parsing, in itself, uses the JavaFX </span><span lang="EN-US"><a href="http://java.sun.com/javafx/1.3/docs/api/javafx.data.pull/javafx.data.pull.PullParser.html">PullParser</a></span><span lang="EN-US" style="mso-ansi-language: EN-US;"> </span>to parse the JSON stream and fill the <i>Music</i> JavaFX Bean, and the array of <i>Music</i> JavaFX Bean as the result of the <i>parse</i> method.</div><div class="MsoNormal" style="margin-left: 35.45pt;"><table width="100%"><tr><td align="center">MusicClient.fx</td></tr>
</table><pre><span class="keyword">package</span> client.rest;
<span class="keyword">import</span> javafx.data.pull.Event;
<span class="keyword">import</span> javafx.data.pull.PullParser;
<span class="keyword">import</span> com.sun.javafx.data.pull.impl.StreamException;
<span class="keyword">import</span> java.io.InputStream;
<span class="keyword">import</span> model.Music;
<span class="keyword">import</span> javafx.io.http.HttpRequest;
<span class="keyword">import</span> javafx.io.http.URLConverter;
<span class="keyword">public</span> <span class="keyword">class</span> MusicClient {
<span class="keyword">public</span> <span class="keyword">var</span> musics:Music[];
<span class="keyword">public</span> <span class="keyword">function</span> getArtisteNameBeginningBy(begining :String) {
println(<span class="string">"</span><span class="string">begining </span>{begining}<span class="string">"</span>);
<span class="keyword">var</span> urlConverter = URLConverter{encodeSpaceAsPercent:<span class="ST0">true</span>};
<span class="keyword">var</span> beginings = urlConverter.encodeString(begining);
<span class="keyword">var</span> request: HttpRequest = HttpRequest {
location: <span class="string">"</span><span class="string">http</span><span class="string">://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/</span>{beginings}<span class="string">"</span>
method: HttpRequest.GET
onInput: <span class="keyword">function</span>(input: java.io.InputStream) {
<span class="ST0">try</span> {
musics = parse(input);
<span class="comment">//println("musics {musics}");</span>
} <span class="ST0">finally</span> {
input.close();
}
}
}
request.start();
}
<span class="keyword">function</span> parse(input: InputStream): Music[] {
<span class="keyword">var</span> musics: Music[];
<span class="keyword">var</span> music: Music;
<span class="keyword">d</span><span class="keyword">ef</span> parser = PullParser {
documentType:PullParser.JSON
input: input
onEvent: <span class="keyword">function</span>(event: Event) {
<span class="ST0">if</span> (event.type == PullParser.START_ARRAY_ELEMENT) {
<span class="ST0">if</span>(event.name == <span class="string">"</span><span class="string">music</span><span class="string">"</span> <span class="keyword">and</span> event.level == 0) {
music = Music { };
}
} <span class="ST0">else</span>
<span class="ST0">if</span> (event.type == PullParser.END_ARRAY_ELEMENT) {
<span class="ST0">if</span>(event.name == <span class="string">"</span><span class="string">music</span><span class="string">"</span> <span class="keyword">and</span> event.level == 0) {
<span class="keyword">insert</span> music <span class="keyword">into</span> musics;
}
} <span class="ST0">else</span> {
<span class="ST0">if</span>(event.name == <span class="string">"</span><span class="string">id</span><span class="string">"</span> <span class="keyword">and</span>
event.level == 1 <span class="keyword">and</span>
event.type == PullParser.TEXT ) {
music.id = java.lang.Long.parseLong (event.text);
} <span class="ST0">else</span>
<span class="ST0">if</span>(event.name == <span class="string">"</span><span class="string">artisteName</span><span class="string">"</span> <span class="keyword">and</span>
event.level == 1 <span class="keyword">and</span>
event.type == PullParser.TEXT ) {
music.artisteName = event.text;
} <span class="ST0">else</span>
<span class="ST0">if</span>(event.name == <span class="string">"</span><span class="string">albumTitle</span><span class="string">"</span> <span class="keyword">and</span>
event.level == 1 <span class="keyword">and</span>
event.type == PullParser.TEXT ) {
music.albumTitle = event.text;
}
}
}
}
<span class="ST0">try</span>{
parser.parse();
}<span class="ST0">catch</span> (e: StreamException){
println(e.getMessage())
}
<span class="ST0">return</span> musics;
}
}
</pre></div><div class="MsoNormal"><b><u><span lang="EN-US" style="mso-ansi-language: EN-US;">The UI<o:p></o:p></span></u></b></div><div class="MsoNormal"><span lang="EN-US" style="mso-ansi-language: EN-US;">The UI is the same as the UI used in the post: the JavaFX and JPA 2.0 with my custom component[2] , except the calls to the client of the service by the SearchTextBox component.<o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 35.45pt;"><table width="100%"><tr><td align="center">Main.fx</td></tr>
</table><pre><span class="keyword">package</span> javafxrestfulclient;
<span class="keyword">import</span> javafx.stage.Stage;
<span class="keyword">import</span> javafx.scene.Scene;
<span class="keyword">import</span> javafx.scene.text.Text;
<span class="keyword">import</span> javafx.scene.text.Font;
<span class="keyword">import</span> javafx.scene.control.ListView;
<span class="keyword">import</span> customcomponent.SearchTextBox;
<span class="keyword">import</span> client.rest.MusicClient;
<span class="keyword">var</span> mc:MusicClient = MusicClient{};
Stage {
title: <span class="string">"</span><span class="string">Application title</span><span class="string">"</span>
width: 600
height: 250
scene: Scene {
stylesheets : [<span class="string">"</span>{__DIR__}<span class="string">resources/mac.css</span><span class="string">"</span>]
content: [
Text {
font: Font {
size: 16
}
x: 10
y: 30
content: <span class="string">"</span><span class="string">Search DB</span><span class="string">"</span>
}
SearchTextBox {
styleClass : <span class="string">"</span><span class="string">searchTextBox</span><span class="string">"</span>
translateX: 10
translateY: 40
onResetSearch: <span class="keyword">function</span> () {
println(<span class="string">"</span><span class="string">reset !</span><span class="string">"</span>);
<span class="keyword">delete</span> mc.musics;
}
onSearch: <span class="keyword">function</span> (s: String) {
println(<span class="string">"</span><span class="string">Search of : </span>{s}<span class="string">"</span>);
<span class="keyword">delete</span> mc.musics;
mc.getArtisteNameBeginningBy(s);
}
}
ListView {
managed: <span class="ST0">false</span>
layoutY: 75
width: 575
height: 100
items: <span class="keyword">bind</span> mc.musics
}
]
}
}
</pre></div><div class="MsoNormal"><b><span lang="EN-US"><a href="http://pagesperso-orange.fr/paddy.fr//august/javafxClient/JavaFXRestfulClient.zip">Get the NetBeans project</a><o:p></o:p></span></b></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-12028863323105053492010-07-15T18:31:00.000+01:002010-07-15T18:31:45.035+01:00Stephen Chin's Petition to Open Source JavaFXIf you like JavaFX , go to sign the Stephen Chin’s Petition to Open Source JavaFX !<br />
<a href="http://steveonjava.com/javafx-petition/">http://steveonjava.com/javafx-petition/</a>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-77399013342218295712010-07-04T22:28:00.001+01:002010-07-04T22:29:00.499+01:00RESTful service with JAX-RS (and JPA 2 for the access to the data)<div class="MsoNormal"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">This is the first part of two, which have for purpose to create a RESTful service with JAX-RS (part 1) and to access it in JavaFX (part 2)<o:p></o:p></span></div><div class="MsoNormal"><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">In this first part, we will create a RESTful service using JAX-RS and because this service will have<span style="mso-spacerun: yes;"> </span>an access to a database, we will use JPA 2.0.</span></div><div class="MsoNormal"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">To do that, we are going:<o:p></o:p></span></div><ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">to create the database and one table<o:p></o:p></span></li>
<li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">to create a data source<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></li>
<li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">to create the JPA entity and the persistence.xml<o:p></o:p></span></li>
<li class="MsoNormal" style="mso-list: l0 level1 lfo1; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">and to create the RESTful service which will call the entity</span></li>
</ul><div class="MsoNormal"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;"><o:p></o:p></span></div><a name='more'></a><br />
<div class="MsoNormal"><b><u><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">Create the database and the table<o:p></o:p></span></u></b></div><div class="MsoNormal"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">for the database and the the table, we'll re-use the derby database and the table created for the post : <a href="http://paddyweblog.blogspot.com/2010/02/examples-using-jpa-20.html">Examples using JPA 2.0</a>. <o:p></o:p></span></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b><u><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">Create a data source<o:p></o:p></span></u></b></div><ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l1 level1 lfo2; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">Create a data source named jdbc/javafxDB and connected to the database in your application server. <b><u><br />
</u></b>For Glassfish V3, create :<o:p></o:p></span></li>
</ul><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l1 level2 lfo2; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: OpenSymbol; font-size: 11.0pt; mso-bidi-font-family: OpenSymbol; mso-fareast-font-family: OpenSymbol;"><span style="mso-list: Ignore;">◦<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">One Connection pools for Derby named JavafxDBPool and with the parameters to access to the database. <span style="background: yellow;"><br />
</span><span style="background: white;">For the parameters you</span> should have something like this.</span></div><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l1 level2 lfo2; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;"></span><a href="http://lh5.ggpht.com/_rpz_ucpdDqg/TC5mm_jbzQI/AAAAAAAAAHg/PNOr74-b6v0/Additional%20Properties.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://lh5.ggpht.com/_rpz_ucpdDqg/TC5mm_jbzQI/AAAAAAAAAHg/PNOr74-b6v0/Additional%20Properties.png" /></a></div><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l1 level2 lfo2; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;"><br />
</span></div><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l1 level2 lfo2; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: OpenSymbol; font-size: 11.0pt; mso-bidi-font-family: OpenSymbol; mso-fareast-font-family: OpenSymbol;"><span style="mso-list: Ignore;">◦<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">One JDBC Resources with jdbc/javafxDB as JNDI Name and JavafxDBPool as Pool Name<o:p></o:p></span></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b><u><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The Entity and the persistance.xml<o:p></o:p></span></u></b></div><ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l2 level1 lfo3; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The entity is almost the same one as the entity created for the post : <a href="http://paddyweblog.blogspot.com/2010/02/examples-using-jpa-20.html">Examples using JPA 2.0</a>.<br />
I just added <o:p></o:p></span></li>
</ul><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l2 level2 lfo3; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: OpenSymbol; font-size: 11.0pt; mso-bidi-font-family: OpenSymbol; mso-fareast-font-family: OpenSymbol;"><span style="mso-list: Ignore;">◦<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">One named query which will be used by the RESTful service <style type="text/css">
<!-- body {color: #000000; background-color: #ffffff; font-family: Monospaced} pre {color: #000000; background-color: #ffffff; font-family: Monospaced} table {color: #000000; background-color: #e9e8e2; font-family: Monospaced} .ST0 {color: #969696; font-family: Monospaced; font-weight: bold} .comment {color: #969696} .character {color: #ce7b00} .keyword-directive {color: #0000e6} .ST1 {color: #ce7b00; font-family: Monospaced; font-weight: bold} .xml-attribute {color: #009900} .xml-value {color: #ce7b00} .xml-tag {color: #0000e6} --> </style><br />
<pre>@NamedQuery(name = <span class="character">"</span><span class="character">findAllAlbumWhereArtisteLike</span><span class="character">"</span>,query=<span class="character">"</span><span class="character">select m from Music m where m.artisteName like :param</span><span class="character">"</span>)</pre></span></div><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l2 level2 lfo3; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: OpenSymbol; font-size: 11.0pt; mso-bidi-font-family: OpenSymbol; mso-fareast-font-family: OpenSymbol;"><span style="mso-list: Ignore;">◦<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">And the annotation @XmlRootAnnotation for the JAXB serialization <br />
<span><pre>@XmlRootElement
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> Music <span class="keyword-directive">implements</span> Serializable {
</pre></span><span style="mso-spacerun: yes;"> </span><br />
<span><br />
<table width="100%"><tr><td align="center">Music.java</td></tr>
</table><pre><span class="keyword-directive"> package</span> paddy.entities;
<span class="keyword-directive">import</span> java.io.Serializable;
<span class="keyword-directive">import</span> javax.persistence.Column;
<span class="keyword-directive">import</span> javax.persistence.Entity;
<span class="keyword-directive">import</span> javax.persistence.GeneratedValue;
<span class="keyword-directive">import</span> javax.persistence.Id;
<span class="keyword-directive">import</span> javax.persistence.NamedQueries;
<span class="keyword-directive">import</span> javax.persistence.NamedQuery;
<span class="keyword-directive">import</span> javax.xml.bind.annotation.XmlRootElement;
<span class="comment">/**</span>
<span class="comment"> *</span>
<span class="comment"> * </span><span class="ST0">@author</span> <span class="comment">Patrick</span>
<span class="comment">*/</span>
@Entity
@NamedQueries({
@NamedQuery(name = <span class="character">"</span><span class="character">findAllAlbum</span><span class="character">"</span>, query= <span class="character">"</span><span class="character">select m from Music m</span><span class="character">"</span>),
@NamedQuery(name = <span class="character">"</span><span class="character">findAllAlbumWhereArtisteLike</span><span class="character">"</span>,query=<span class="character">"</span><span class="character">select m from Music m where m.artisteName like :param</span><span class="character">"</span>)
})
@XmlRootElement
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> Music <span class="keyword-directive">implements</span> Serializable {
@Id
@GeneratedValue
<span class="keyword-directive">private</span> Long id;
@Column(name = <span class="character">"</span><span class="character">artist_name</span><span class="character">"</span>)
<span class="keyword-directive">private</span> String artisteName;
@Column(name = <span class="character">"</span><span class="character">album_title</span><span class="character">"</span>)
<span class="keyword-directive">private</span> String albumTitle;
<span class="keyword-directive">public</span> Music() {
}
<span class="keyword-directive">public</span> String getAlbumTitle() {
<span class="keyword-directive">return</span> albumTitle;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setAlbumTitle(String albumTitle) {
<span class="keyword-directive">this</span>.albumTitle = albumTitle;
}
<span class="keyword-directive">public</span> String getArtisteName() {
<span class="keyword-directive">return</span> artisteName;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setArtisteName(String artisteName) {
<span class="keyword-directive">this</span>.artisteName = artisteName;
}
<span class="keyword-directive">public</span> Long getId() {
<span class="keyword-directive">return</span> id;
}
<span class="keyword-directive">public</span> <span class="keyword-directive">void</span> setId(Long id) {
<span class="keyword-directive">this</span>.id = id;
}
@Override
<span class="keyword-directive">public</span> String toString(){
StringBuilder sb = <span class="keyword-directive">new</span> StringBuilder();
sb.append(<span class="character">"</span><span class="character">id : </span><span class="character">"</span>);sb.append(id);sb.append(<span class="character">"</span><span class="character"> ; </span><span class="character">"</span>);
sb.append(<span class="character">"</span><span class="character">artisteName : </span><span class="character">"</span>);sb.append(artisteName);sb.append(<span class="character">"</span><span class="character"> ; </span><span class="character">"</span>);
sb.append(<span class="character">"</span><span class="character">albumTitle : </span><span class="character">"</span>);sb.append(albumTitle);
sb.append(<span class="character">"</span> <span class="ST1">\n</span><span class="character">"</span>);
<span class="keyword-directive">return</span> sb.toString();
}
}
</pre><o:p></o:p></span></span></div><ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l2 level1 lfo3; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The persistence.xml file is very simple, it contains only:<o:p></o:p></span></li>
</ul><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l2 level2 lfo3; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: OpenSymbol; font-size: 11.0pt; mso-bidi-font-family: OpenSymbol; mso-fareast-font-family: OpenSymbol;"><span style="mso-list: Ignore;">◦<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The name of the data source <br />
<span style="mso-tab-count: 1;"> </span><jta-data-source>jdbc/javafxDB</jta-data-source><o:p></o:p></span></div><div class="MsoNormal" style="margin-left: 54.0pt; mso-list: l2 level2 lfo3; tab-stops: list 54.0pt; text-indent: -18.0pt;"><span lang="EN-US" style="font-family: OpenSymbol; font-size: 11.0pt; mso-bidi-font-family: OpenSymbol; mso-fareast-font-family: OpenSymbol;"><span style="mso-list: Ignore;">◦<span style="font: 7.0pt "Times New Roman";"> </span></span></span><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">And the entity managed by the persistence unit.<br />
<span style="mso-tab-count: 1;"> </span><class>paddy.entities.Music</class><br />
<span><br />
<table width="100%"><tr><td align="center">persistence.xml</td></tr>
</table><pre><span class="ST0"> <?</span><span class="ST0">xml</span> version="1.0" encoding="UTF-8"?>
<span class="xml-tag"><persistence</span> <span class="xml-attribute">version</span>=<span class="xml-value">"1.0"</span> <span class="xml-attribute">xmlns</span>=<span class="xml-value">"http://java.sun.com/xml/ns/persistence"</span><span class="xml-tag">></span>
<span class="xml-tag"><persistence-unit</span> <span class="xml-attribute">name</span>=<span class="xml-value">"MusicAndLight"</span> <span class="xml-attribute">transaction-</span><span class="xml-attribute">type</span>=<span class="xml-value">"JTA"</span><span class="xml-tag">></span>
<span class="xml-tag"><provider</span><span class="xml-tag">></span>org.eclipse.persistence.jpa.PersistenceProvider<span class="xml-tag"></provider</span><span class="xml-tag">></span>
<span class="xml-tag"><jta-data-source</span><span class="xml-tag">></span>jdbc/javafxDB<span class="xml-tag"></jta-data-source</span><span class="xml-tag">></span>
<span class="xml-tag"><class</span><span class="xml-tag">></span>paddy.entities.Music<span class="xml-tag"></class</span><span class="xml-tag">></span>
<span class="xml-tag"></persistence-unit</span><span class="xml-tag">></span>
<span class="xml-tag"></persistence</span><span class="xml-tag">></span>
</pre></span><o:p></o:p></span></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><b><u><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The RESTful service<o:p></o:p></span></u></b></div><div class="MsoNormal"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The service is very simple; it returns a list of all the records from the table where the field artisteName begin by the parameter "beginby".<span style="mso-spacerun: yes;"> </span><o:p></o:p></span></div><div style="margin-left: 54.0pt"><span lang="EN-US" style=" font-size: 11.0pt;"><br />
<table width="100%"><tr><td align="center">MusicServices.java</td></tr>
</table><pre><span class="keyword-directive">package</span> services.restful;
<span class="keyword-directive">import</span> java.util.List;
<span class="keyword-directive">import</span> javax.ejb.Stateless;
<span class="keyword-directive">import</span> javax.persistence.EntityManager;
<span class="keyword-directive">import</span> javax.persistence.PersistenceContext;
<span class="keyword-directive">import</span> javax.persistence.Query;
<span class="keyword-directive">import</span> javax.ws.rs.GET;
<span class="keyword-directive">import</span> javax.ws.rs.Path;
<span class="keyword-directive">import</span> javax.ws.rs.PathParam;
<span class="keyword-directive">import</span> javax.ws.rs.Produces;
<span class="keyword-directive">import</span> paddy.entities.Music;
<span class="comment">/**</span>
<span class="comment"> *</span>
<span class="comment"> * </span><span class="ST0">@author</span> <span class="comment">patrick</span>
<span class="comment">*/</span>
<span class="comment">// curl http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginni</span><span class="comment">ngBy/Arc</span>
@Path(<span class="character">"</span><span class="character">/ArtisteNameBeginningBy</span><span class="character">"</span>)
@Stateless
@Produces (<span class="character">"</span><span class="character">application/json</span><span class="character">"</span>)
<span class="keyword-directive">public</span> <span class="keyword-directive">class</span> MusicServices {
@PersistenceContext(unitName=<span class="character">"</span><span class="character">MusicAndLight</span><span class="character">"</span>)
EntityManager em;
@GET
@Path(<span class="character">"</span><span class="character">{beginBy}/</span><span class="character">"</span>)
<span class="keyword-directive">public</span> List<Music> getArtisteNameBeginningBy(@PathParam(<span class="character">"</span><span class="character">beginBy</span><span class="character">"</span>) String beginBy){
System.out.println(<span class="character">"</span><span class="character">beginBy : </span><span class="character">"</span>+beginBy);
String param = beginBy+<span class="character">"</span><span class="character">%</span><span class="character">"</span>;
Query query = em.createNamedQuery(<span class="character">"</span><span class="character">findAllAlbumWhereArtisteLike</span><span class="character">"</span>);
query.setParameter(<span class="character">"</span><span class="character">param</span><span class="character">"</span>, param);
List<Music> musicsDB = query.getResultList();
System.out.println(<span class="character">"</span><span class="character">musi</span><span class="character">csDB : </span><span class="character">"</span>+musicsDB);
<span class="keyword-directive">return</span> musicsDB;
}
}
</pre></span><br />
</div><div class="MsoNormal"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The key points :<o:p></o:p></span></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><div class="separator" style="clear: both; text-align: center;"></div><ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l3 level1 lfo4; tab-stops: list 36.0pt;"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">@Path</span></li>
</ul><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: medium;"><span class="Apple-style-span" style="font-size: 15px;"><div class="separator" style="clear: both; text-align: center;"><a href="http://lh6.ggpht.com/_rpz_ucpdDqg/TC5mm-FUPsI/AAAAAAAAAHc/DdQ4gEqjd5E/%40path.jpg" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://lh6.ggpht.com/_rpz_ucpdDqg/TC5mm-FUPsI/AAAAAAAAAHc/DdQ4gEqjd5E/%40path.jpg" /></a></div></span></span><ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l3 level1 lfo4; tab-stops: list 36.0pt;"><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;"><span style="background: yellow;"></span></span><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">@Produce, the service produces a JSON output with the help of JAXB</span></li>
<li class="MsoNormal" style="mso-list: l3 level1 lfo4; tab-stops: list 36.0pt;"><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;"></span><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">@GET, the service is accessible by the method GET</span></li>
<li class="MsoNormal" style="mso-list: l3 level1 lfo4; tab-stops: list 36.0pt;"><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;"></span><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: 15px;">@PersistenceContext, the entity manager is created and injected by the container</span></li>
</ul><div class="MsoNormal"><b><u><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">The web.xml<o:p></o:p></span></u></b></div><div class="MsoNormal"><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">And of course you have to configure the Jersey Servlet in the web.xml<o:p></o:p></span></div><div style="margin-left: 54.0pt"><span lang="EN-US" style=" font-size: 11.0pt;"><br />
<table width="100%"><tr><td align="center">web.xml</td></tr>
</table><pre><span class="xml-tag"><servlet</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-name</span><span class="xml-tag">></span>Jersey<span class="xml-tag"></servlet-name</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-class</span><span class="xml-tag">></span>com.sun.jersey.spi.container.servlet.ServletContainer<span class="xml-tag"></servle</span><span class="xml-tag">t-class</span><span class="xml-tag">></span>
<span class="xml-tag"></servlet</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-mapping</span><span class="xml-tag">></span>
<span class="xml-tag"><servlet-name</span><span class="xml-tag">></span>Jersey<span class="xml-tag"></servlet-name</span><span class="xml-tag">></span>
<span class="xml-tag"><url-pattern</span><span class="xml-tag">></span>/rs/*<span class="xml-tag"></url-pattern</span><span class="xml-tag">></span>
<span class="xml-tag"></</span><span class="xml-tag">servlet-mapping</span><span class="xml-tag">></span></pre></span><br />
<o:p></o:p></div><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: medium;"><div class="MsoNormal"><b><u><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;">Now, let's test the service with:<o:p></o:p></span></u></b></div></span><br />
<ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l4 level1 lfo5; tab-stops: list 36.0pt;"><span lang="EN-US" style="background: white; font-family: "Calibri","sans-serif"; font-size: 11.0pt;">curl<o:p></o:p></span></li>
</ul><div class="MsoNormal"><span lang="EN-US" style="background: white; font-family: "Calibri","sans-serif"; font-size: 11.0pt;">curl http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/Arc<o:p></o:p></span></div><ul style="margin-top: 0cm;" type="disc"><li class="MsoNormal" style="mso-list: l4 level1 lfo5; tab-stops: list 36.0pt;"><span lang="EN-US" style="background: white; font-family: "Calibri","sans-serif"; font-size: 11.0pt;">or your browser<o:p></o:p></span></li>
</ul><div class="MsoNormal"><span style="font-family: "Calibri","sans-serif"; font-size: 11.0pt; mso-ansi-language: #00FF; mso-bidi-language: #00FF; mso-fareast-language: #00FF;">http://localhost:8080/RESTfulServices/rs/ArtisteNameBeginningBy/Arc</span><span lang="EN-US" style="background: white; font-family: "Calibri","sans-serif"; font-size: 11.0pt;"><o:p></o:p></span></div><div class="MsoNormal"><br />
</div><div class="MsoNormal"><span lang="EN-US" style="background: white; font-family: "Calibri","sans-serif"; font-size: 11.0pt;"><b>and the result should be :</b><o:p></o:p></span></div><div class="separator" style="clear: both; text-align: center;"><a href="http://lh5.ggpht.com/_rpz_ucpdDqg/TC5mm6Y7kuI/AAAAAAAAAHk/5Q00LD6zI78/resuljson.png" imageanchor="1" style="margin-left: 1em; margin-right: 1em;"><img border="0" src="http://lh5.ggpht.com/_rpz_ucpdDqg/TC5mm6Y7kuI/AAAAAAAAAHk/5Q00LD6zI78/resuljson.png" /></a></div><div class="MsoNormal"><span class="Apple-style-span" style="font-family: Calibri, sans-serif; font-size: medium;"><span class="Apple-style-span" style="font-size: 15px;"><br />
</span></span></div><div class="MsoNormal"><b><span lang="EN-US" style="font-family: "Calibri","sans-serif"; font-size: 11.0pt;"><a href="http://pagesperso-orange.fr/paddy.fr/july/RESTfulServices/RESTfulServices.zip">Get the NetBeans project</a><o:p></o:p></span></b></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com1tag:blogger.com,1999:blog-6224595597588014495.post-140341792742573652010-06-25T21:27:00.000+01:002010-06-25T21:27:06.463+01:00JavaFX CSS Reference GuideThe <a href="http://java.sun.com/javafx/1.3/docs/api/javafx.scene/doc-files/cssref.html">JavaFX CSS Reference Guide</a> is availablePatrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0tag:blogger.com,1999:blog-6224595597588014495.post-70041666832741299632010-06-16T22:42:00.017+01:002010-10-06T23:15:46.721+01:00Slimshady:D5- JavaFX<div class="MsoNormal"><span lang="EN-US">I don’t know what is Slimshady :D5- JavaFX in comparison with the actual JavaFX, but I think it should be a great technology ! :)<br />
See yourself </span><a href="http://blogs.sun.com/ant/"><span lang="EN-US">http://blogs.sun.com/ant/</span></a><span lang="EN-US"><br />
And if you have some information about Slimshady:D5, let me know ;)</span><br />
<span lang="EN-US"><br />
</span><br />
<span lang="EN-US"></span><span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"><span lang="EN-US" style="color: #333333; font-family: Verdana, sans-serif; font-size: 10pt; line-height: 115%;"><b>[Update: October 6, 2010</b></span></span><span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"><b>]</b></span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"><b></b></span><span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 14px;">I don't know why (may be because of <a href="http://groups.google.com/group/visage-dev/msg/3b03016484745cc5">that</a>) , but the <a href="http://blogs.sun.com/ant/">Anthony Rogers's blog</a> is down... </span><br />
<span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif; font-size: 13px; line-height: 14px;"></span><span class="Apple-style-span" style="color: #333333; font-family: Verdana, sans-serif;"><span lang="EN-US" style="color: #333333; font-family: Verdana, sans-serif; font-size: 10pt; line-height: 115%;"><span class="apple-style-span"><span lang="EN-US" style="color: #333333; font-family: Verdana, sans-serif; font-size: 10pt; line-height: 115%;">However, you could always see some videos of Slimshady</span> on YouTube</span> you could always see some <a href="http://www.youtube.com/user/yourlookingatanother#p/u">videos of Slimshady</a></span> on YouTube</span></div>Patrick Championhttp://www.blogger.com/profile/17766599320454819753noreply@blogger.com0