The tips are :
- Know the devices which are connected
- Deploy your application on real devices
- Deploy your application on SD Card
- Know the location (internal or SD Card) of your application and move it or stop it
var factor = (6 * Math.PI) / imageHeight; var v = (Math.sin(j * factor) * 20) + 20;instead of this lines
var factor = (2 * Math.PI) / imageHeight; var v = (Math.sin(j * factor) * 10) + 20;
Distortion.fx |
package distortion; import javafx.scene.image.Image; import javafx.geometry.Rectangle2D; import javafx.scene.image.ImageView; import javafx.scene.Scene; import javafx.stage.Stage; import javafx.util.Math; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.runtime.ConditionalFeature; import javafx.runtime.Platform; import javafx.scene.shape.Rectangle; import javafx.scene.paint.Color; /** * @author paddy */ println("Effect enabled: {Platform.isSupported(ConditionalFeature.EFFECT)}"); println("Input Method enabled: {Platform.isSupported(ConditionalFeature.INPUT_METHOD)}"); println("Scene 3D enabled: {Platform.isSupported(ConditionalFeature.SCENE3D)}"); println("Shape Clip enabled: {Platform.isSupported(ConditionalFeature.SHAPE_CLIP)}"); var img = Image { //url: "{__DIR__}images/glassfish.jpg" url: "{__DIR__}images/fc-barcelone-logo.jpg" } def imageWidth = bind img.width as Integer; def imageHeight = bind img.height as Integer; def lineWidth = imageWidth; def lineHeight = 1; var distortionMap: Float[]; var index = 0; for (j in [0..<imageHeight * 2]) { var factor = (2 * Math.PI) / imageHeight; var v = (Math.sin(j * factor) * 10) + 20; //var factor = (6 * Math.PI) / imageHeight; //var v = (Math.sin(j * factor) * 20) + 20; insert v into distortionMap; } def lineViewports = for (row in [0..imageHeight]) { Rectangle2D { minX: 0, minY: row, width: lineWidth, height: lineHeight } } var distortionImg = bind for (row in [0..imageHeight]) { ImageView { x: bind distortionMap[row + index] y: row viewport: bind lineViewports[row] image: img } } var t = Timeline { repeatCount: Timeline.INDEFINITE keyFrames: KeyFrame { time: 8ms canSkip: true action: function (): Void { index = index + 1; if (index > imageHeight) { index = 0; } } } } t.play(); Stage { title: "Application title" scene: Scene { width: imageWidth +40 height: imageHeight + 1 content: [ Rectangle { x: 0, y: 0 width: imageWidth +40 , height: imageHeight + 1 fill: Color.BLACK //fill: Color.GHOSTWHITE } distortionImg ] } }
... init { var g = Group { content: [ Group { ... content: [ Circle { ... } Rectangle { .... } ... ] ... ] } insert g into children; } ...
SearchTextBox.fx |
package customcomponent; import javafx.scene.Group; import javafx.scene.paint.Color; import javafx.scene.shape.Circle; import javafx.scene.shape.Rectangle; import javafx.scene.input.MouseEvent; import javafx.scene.control.TextBox; import javafx.scene.input.KeyEvent; /** * @author Patrick */ public class SearchTextBox extends TextBox { public var onResetSearch: function(): Void; public var onSearch: function(s: String): Void; override var style = "-fx-padding: 0 16 0 0; "; //override var styleClass = "searchTextBox text-box"; //override var styleClass = "searchTextBox"; override var onKeyTyped = function(event:KeyEvent){ if (this.rawText!=""){ onSearch(this.rawText); }else{ onResetSearch(); } } init { var g = Group { content: [ Group { var crossWidth = bind this.layoutBounds.height * 0.45; var crossHeight = bind this.layoutBounds.height * 0.05; visible: bind this.rawText.length() > 0 layoutX: bind this.layoutBounds.width - (this.layoutBounds.height / 2.0) layoutY: bind this.layoutBounds.height / 2.0 content: [ Circle { fill: Color.GRAY radius: bind this.layoutBounds.height * 0.325 // 65% of the texbox height and div 2 for the radius } Rectangle { width: bind crossWidth height: bind crossHeight translateX: bind 0 - crossWidth / 2.0 translateY: bind 0 - crossHeight / 2.0 fill: Color.WHITE rotate: 45 } Rectangle { width: bind crossWidth height: bind crossHeight translateX: bind 0 - crossWidth / 2.0 translateY: bind 0 - crossHeight / 2.0 fill: Color.WHITE rotate: -45 } ] onMouseClicked: function (event: MouseEvent) { this.commit(); this.text = ""; onResetSearch(); } } ] } insert g into children; } }
Main.fx |
package searchtextbox; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.text.Text; import javafx.scene.text.Font; import javafx.scene.control.Button; import javafx.scene.control.RadioButton; import javafx.scene.control.ToggleGroup; import customcomponent.SearchTextBox; /** * @author Patrick */ class ExtRadioButton extends RadioButton { public var action:function(); override public var selected on replace { if (selected) { action(); } } } def macStyleSheet="{__DIR__}resources/mac.css"; def defaultStyleSheet = "/customcomponent/stbcaspian.css"; var stylesheets:String = macStyleSheet; Stage { title: "Application title" width: 250 height: 200 var cssToggleGroup = ToggleGroup {}; scene: Scene { stylesheets : bind stylesheets content: [ Text { font : Font { size : 16 } x: 10 y: 30 content: "Search " } SearchTextBox { styleClass : "searchTextBox" translateX :10 translateY :40 onResetSearch:function(){ println("reset !"); } onSearch:function(s: String){ println("Search of : {s}"); } } Button { text: "just a button to change focus" translateX :10 translateY :80 action: function() { println("Hello !") } } ExtRadioButton { text: "use the default CSS" translateX :10 translateY :110 toggleGroup: cssToggleGroup action: function() { stylesheets = defaultStyleSheet; } } ExtRadioButton { text: "use the mac CSS" translateX :10 translateY :130 toggleGroup: cssToggleGroup selected: true action: function() { stylesheets = macStyleSheet; } } ] } }
KeyValue
evaluation"
in Java FX 1.3 Migration Guide) and thus my Duke Anim doesn’t work in Java FX 1.3 :(.Main.fx |
package dukeanim; import java.util.Random; import javafx.animation.Interpolator; import javafx.animation.KeyFrame; import javafx.animation.Timeline; import javafx.scene.image.Image; import javafx.scene.image.ImageView; import javafx.scene.Scene; import javafx.scene.transform.Translate; import javafx.runtime.ConditionalFeature; import javafx.runtime.Platform; import javafx.stage.Stage; class DukeAnimModel { public var imageURL = "{__DIR__}images/duke.png"; public var x = 0; public var y = 0; var xTarget = 0; var yTarget = 0; var xTemp = 0; var yTemp = 0; public var anim:Timeline = Timeline { autoReverse: false keyFrames: [ KeyFrame { time: 0s values: [x => xTemp, y => yTemp] }, KeyFrame { time: 1s values: [x => xTarget tween Interpolator.SPLINE(0,.5,.5,1),y => yTarget tween Interpolator.SPLINE(0,.5,.5,1)] action: function(): Void{ var generator = new Random(); xTarget = (generator.nextFloat() * 240 + 1) as Integer; yTarget = (generator.nextFloat() * 320 + 1) as Integer; xTemp=x; yTemp=y; anim.evaluateKeyValues(); } }, ] repeatCount: Timeline.INDEFINITE }; } println("Effect enabled: {Platform.isSupported(ConditionalFeature.EFFECT)}"); println("Input Method enabled: {Platform.isSupported(ConditionalFeature.INPUT_METHOD)}"); println("Scene 3D enabled: {Platform.isSupported(ConditionalFeature.SCENE3D)}"); println("Shape Clip enabled: {Platform.isSupported(ConditionalFeature.SHAPE_CLIP)}"); var dukeAnimModel = DukeAnimModel {} dukeAnimModel.anim.play(); Stage { title: "Application title" width: 240 height: 320 scene: Scene { content: ImageView { transforms: Translate { x: bind dukeAnimModel.x y: bind dukeAnimModel.y } image: Image { url: dukeAnimModel.imageURL } } } onClose: function(){ println("exit"); } }
@Stateless @Remote(HelloEjbAsynchronousRemote.class) public class HelloEjbAsynchronous implements HelloEjbAsynchronousRemote { @Asynchronous @Override public Future<String> ejbAsynchronousSayHello(String name){
return new AsyncResult<String>("Hello "+name);For the client, you just have to call the remote ejbAsynchronousSayHello by using the new portable global JNDI names.
HelloEjbAsynchronousRemote ha = (HelloEjbAsynchronousRemote)ic.lookup("java:global/EjbAsynchronous/HelloEjbAsynchronous"); Future future = ha.ejbAsynchronousSayHello("Patrick");The client can retrieve the result value with Future.get() and can get the state of the processing with Future.isDone().
String ret = (String)future.get();
Full source code of the EJB - HelloEjbAsynchronous.java |
package fr.paddy.ejb31; import java.util.Date; import java.util.concurrent.Future; import javax.ejb.AsyncResult; import javax.ejb.Asynchronous; import javax.ejb.Remote; import javax.ejb.Stateless; @Stateless @Remote(HelloEjbAsynchronousRemote.class) public class HelloEjbAsynchronous implements HelloEjbAsynchronousRemote { @Asynchronous @Override public Future<String> ejbAsynchronousSayHello(String name){ System.out.println(new Date().toString()+" - Begin - HelloEjbAsynchronos->ejbAsynchronousSayHello "+name); try{ Thread.sleep(5*1000); }catch (Exception e){ e.printStackTrace(); } System.out.println(new Date().toString()+" - End - HelloEjbAsynchronos->ejbAsynchronousSayHello "+name); return new AsyncResult<String>("Hello "+name); } }The ejbAsynchronousSayHello method, which is declared asynchronous, just wait 5 seconds to simulate a long processing and return the String "Hello "+name, the variable name being passed as parameter.
Full source code of the remote interface - HelloEjbAsynchronousRemote.java |
package fr.paddy.ejb31; import java.util.concurrent.Future; public interface HelloEjbAsynchronousRemote { public Future<String> ejbAsynchronousSayHello(String name); }
Full source code of the EJB Client - ClientMain.java |
import java.util.Properties; import java.util.concurrent.ExecutionException; import java.util.concurrent.Future; import javax.naming.InitialContext; import javax.naming.NamingException; import fr.paddy.ejb31.HelloEjbAsynchronousRemote; import java.util.Date; public class ClientMain { public static void main(String[] args) { Properties props = new Properties(); props.setProperty("java.naming.factory.initial", "com.sun.enterprise.naming.SerialInitContextFactory"); props.setProperty("java.naming.factory.url.pkgs", "com.sun.enterprise.naming"); props.setProperty("java.naming.factory.state", "com.sun.corba.ee.impl.presentation.rmi.JNDIStateFactoryImpl"); props.setProperty("org.omg.CORBA.ORBInitialHost", "localhost"); props.setProperty("org.omg.CORBA.ORBInitialPort", "3700"); try{ InitialContext ic = new InitialContext(props); String ret=""; HelloEjbAsynchronousRemote ha = (HelloEjbAsynchronousRemote)ic.lookup("java:global/EjbAsynchronous/HelloEjbAsynchronous"); Future future = ha.ejbAsynchronousSayHello("Patrick"); while (!future.isDone()){ Thread.sleep(1000); System.out.println(new Date().toString()+" - I do other things ..."); } ret = (String)future.get(); System.out.println(new Date().toString()+" - ret : "+ret); }catch (NamingException ne){ ne.printStackTrace(); }catch (InterruptedException ie){ ie.printStackTrace(); }catch (ExecutionException ee){ ee.printStackTrace(); } } }
while (!future.isDone()){ Thread.sleep(1000); System.out.println(new Date().toString()+" - I do other things ..."); // System.out.println("futur.isDone"+future.isDone()); // just a hack, because at the moment future.isDone doesn't work ! try{ Object o = future.get(10,TimeUnit.MILLISECONDS); }catch (TimeoutException te){ // te.printStackTrace(); } // end of the hack // System.out.println("futur.isDone"+future.isDone()); }
In JPQL |
String param = "Arc%"; Query query = em.createQuery( "select m from Music m where m.artisteName like :param"); query.setParameter("param", param); List<Music> musics = query.getResultList(); for (Music music : musics){ System.out.println(music); }
Equivalent with Criteria API |
String param = "Arc%"; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Music> query = cb.createQuery(Music.class); Root<Music> music3 = query.from(Music.class); query.where(cb.like(music3.<String>get("artisteName"), cb.parameter(String.class, "param"))); TypedQuery<Music> tq = em.createQuery(query); tq.setParameter("param", param); List<Music> musics = tq.getResultList(); for (Music music : musics){ System.out.println(music); }
In JPQL |
String param = "Archive"; Query query = em.createQuery( "select count(m) from Music m where m.artisteName = :artisteNameParam"); query.setParameter("artisteNameParam", param); Long count1 = (Long)query.getSingleResult(); System.out.println("count : "+count1);
Equivalent with Criteria API |
String param = "Archive"; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Long> query = cb.createQuery(Long.class); Root<Music> music = query.from(Music.class); query.select(cb.count(music)); query.where(cb.equal(music.<String>get("artisteName"), cb.parameter(String.class,"artisteNameParam"))); TypedQuery<Long> tq = em.createQuery(query); tq.setParameter("artisteNameParam", param); Long count = tq.getSingleResult(); System.out.println("count : "+count);
In JPQL |
String param = "Arc%"; Query query = em.createQuery( "select distinct m.artisteName from Music m where m.artisteName like :param"); query.setParameter("param", param); List<String> artistes= query.getResultList(); for (String artiste : artistes){ System.out.println(artiste); }
Equivalent with Criteria API |
String param = "Arc%"; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<String> query = cb.createQuery(String.class); Root<Music> music = query.from(Music.class); query.select(music.<String>get("artisteName")); query.distinct(true); query.where(cb.like(music.<String>get("artisteName"), cb.parameter(String.class, "param"))); TypedQuery<String> tq = em.createQuery(query); tq.setParameter("param", param); List<String> artistes = tq.getResultList(); for (String artiste : artistes){ System.out.println(artiste); }
Main.fx |
package javafxjpa2searchtextbox; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.text.Text; import javafx.scene.text.Font; import customcomponent.SearchTextBox; import javafx.scene.control.ListView; import paddy.domain.Music; import paddy.service.MusicServices; /** * @author Patrick */ var listMusic; var seqMusic:Music[]; var musicServices:MusicServices = MusicServices{}; Stage { title: "Application title" width: 600 height: 250 scene: Scene { stylesheets : ["{__DIR__}resources/mac.css"] content: [ Text { font: Font { size: 16 } x: 10 y: 30 content: "Search DB" } SearchTextBox { translateX: 10 translateY: 40 onResetSearch: function () { println("reset !"); delete seqMusic; } onSearch: function (s: String) { println("Search of : {s}"); listMusic = musicServices.getArtisteNameBeginingBy(s); delete seqMusic; seqMusic = listMusic.toArray(seqMusic); } } ListView { layoutY: 75 width: 575 height: 100 items: bind seqMusic } ] } }
Query query = em.createQuery("select m from Music m where m.artisteName like :param"); query.setParameter("param", param); List<Music> musics = query.getResultList();
@NamedQueries({ @NamedQuery(name = "findAllAlbum", query= "select m from Music m"), @NamedQuery(name = "findAllAlbumWhereArtisteLike",query="select m from Music m where m.artisteName like :param") })
Query query = em.createNamedQuery("findAllAlbumWhereArtisteLike"); query.setParameter("param", param); List<Music> musics = query.getResultList();
MusicServices.java |
package paddy.service; import java.util.List; import javax.persistence.EntityManager; import javax.persistence.EntityManagerFactory; import javax.persistence.Persistence; import javax.persistence.Query; import javax.persistence.criteria.CriteriaBuilder; import javax.persistence.criteria.CriteriaQuery; import javax.persistence.criteria.Root; import paddy.domain.Music; /** * * @author Patrick */ public class MusicServices { EntityManagerFactory emf; EntityManager em; public MusicServices(){ emf = Persistence.createEntityManagerFactory("MusicAndLight"); em = emf.createEntityManager(); } public List<Music> findAll(){ Query query = em.createNamedQuery("findAllAlbum"); List<Music> musics = query.getResultList(); return musics; } public List<Music> getArtisteNameBeginningBy(String begining){ String param = begining+"%"; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Music> query = cb.createQuery(Music.class); Root<Music> music = query.from(Music.class); query.where(cb.like(music.<String>get("artisteName"), param)); List<Music> musics = em.createQuery(query).getResultList(); return musics; } @Override protected void finalize() throws Throwable { try { em.close(); emf.close(); } finally { super.finalize(); } } }
Main.fx |
package javafxjpa2basic; import javafx.stage.Stage; import javafx.scene.Scene; import javafx.scene.control.ListView; import javafx.scene.control.Button; import paddy.domain.Music; import paddy.service.MusicServices; /** * @author Patrick */ var listMusic; var seqMusic:Music[]; var musicServices:MusicServices = MusicServices{}; Stage { title: "Application title" scene: Scene { width: 600 height: 175 content: [ Button { text: "Find all the musics" action: function() { delete seqMusic; listMusic = musicServices.findAll(); seqMusic = listMusic.toArray(seqMusic); println("seqMusic: {seqMusic} "); } } ListView { layoutY : 50 width: 575 height : 100 items: bind seqMusic } ] } }
Music.java |
package paddy.domain; import java.io.Serializable; import javax.persistence.Column; import javax.persistence.Entity; import javax.persistence.GeneratedValue; import javax.persistence.Id; import javax.persistence.NamedQuery; /** * * @author Patrick */ @Entity @NamedQuery(name = "findAllAlbum", query= "select m from Music m") public class Music implements Serializable { @Id @GeneratedValue private Long id; @Column(name = "artist_name") private String artisteName; @Column(name = "album_title") private String albumTitle; public Music() { } ... Getter and setter ... @Override public String toString(){ StringBuffer sb = new StringBuffer(); sb.append("id : ");sb.append(id);sb.append(" ; "); sb.append("artisteName : ");sb.append(artisteName);sb.append(" ; "); sb.append("albumTitle : ");sb.append(albumTitle); sb.append(" \n"); return sb.toString(); } }
META-INF\persistence.xml |
<?xml version="1.0" encoding="UTF-8"?> <persistence version="1.0" xmlns="http://java.sun.com/xml/ns/persistence"> <persistence-unit name="MusicAndLight" transaction-type="RESOURCE_LOCAL"> <provider>org.eclipse.persistence.jpa.PersistenceProvider</provider> <class>paddy.domain.Music</class> <properties> <property name="eclipselink.target-database" value="DERBY"/> <property name="javax.persistence.jdbc.driver" value="org.apache.derby.jdbc.ClientDriver"/> <property name="javax.persistence.jdbc.url" value="jdbc:derby://localhost:1527/javafxDB"/> <property name="javax.persistence.jdbc.user" value="APP"/> <property name="javax.persistence.jdbc.password" value="paddy"/> </properties> </persistence-unit> </persistence>
namedQuery |
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MusicAndLight"); EntityManager em = emf.createEntityManager(); //get and create the namedQuery findAllBum Query query = em.createNamedQuery("findAllAlbum"); //execute the query List<Music> musics = query.getResultList(); for (Music music : musics){ System.out.println(music); } em.close(); emf.close();
Criteria Api |
EntityManagerFactory emf = Persistence.createEntityManagerFactory("MusicAndLight"); EntityManager em = emf.createEntityManager(); String param = "Arc%"; CriteriaBuilder cb = em.getCriteriaBuilder(); CriteriaQuery<Music> query2 = cb.createQuery(Music.class); //select * from Music Root<Music> music2 = query2.from(Music.class); //where artisteName like param //in my example where artisteName like Arc% (begining by Arc) query2.where(cb.like(music2.<String>get("artisteName"), param)); //execute the query List<Music> musics2 = em.createQuery(query2).getResultList(); for (Music music : musics2){ System.out.println(music); } em.close(); emf.close();