FX Experience Has Gone Read-Only
I've been maintaining FX Experience for a really long time now, and I love hearing from people who enjoy my weekly links roundup. One thing I've noticed recently is that maintaining two sites (FX Experience and JonathanGiles.net) takes more time than ideal, and splits the audience up. Therefore, FX Experience will become read-only for new blog posts, but weekly posts will continue to be published on JonathanGiles.net. If you follow @FXExperience on Twitter, I suggest you also follow @JonathanGiles. This is not the end - just a consolidation of my online presence to make my life a little easier!
tl;dr: Follow me on Twitter and check for the latest news on JonathanGiles.net.
by Jonathan Giles | May 5, 2013 | Links
Hi all. Welcome to another weeks worth of links. There is, as is becoming all too frequent, a great number of links this week, spanning new downloads, 3D investigations, embedded discussions and interesting new tools and libraries being developed by people in the community. Keep up the great work! 🙂
- JavaFX 8.0 b88 is available for download, which includes the normal bug fixes, etc, but also JavaFX 3D support on Mac and Linux (it actually appeared in b87, I just forgot to mention it).
- Also newly released this week in Scene Builder 1.1 b25.
- Danno Ferrin has blogged about his touch / gesture test application Touchy FXy. As he says in the post, “One of the main reasons I wrote this is to get a feel for some of the quirks on the various platforms that JavaFX runs on. Already I have some issues in mind, but I want to get a good survey of the problem space before I propose anything.”
- Philipp Dörfler has a guest post over at guigarage about his sbt-fxml project. sbt-fxml is, as Philipp puts it, a tool that “scans for FXML files – either hand written or created by Scene Builder – parses them and creates controller classes with a proper name, package structure, imports, declarations and types. That’s right: types! So now your FXML files suddenly type check thus allowing you to find mistakes almost instantly. And because of SBT, you don’t even have to manually start the build for it. It happens as soon as you save your files.”
- Jasper Potts has posted a video and some code demonstrating how he hacked together support for the 3D SpaceNavigator input device.
- Speaking of Jasper and 3D, he has made available the code to render 3D models from various apps. You can get it by cloning the openjfx mercurial repo and browsing into rt/apps/experiments/3DViewer. He tweeted a screenshot of the application.
- Angela Caicedo has a long and detailed post called “Beyond Beauty: JavaFX, I2C, Parallax, Touch, Raspberry Pi, Gyroscopes and Much More.”
- mihosoft has published part two of the series of posts on workflow visualization with VWorkflows & JavaFX.
- Sean Phillips has posted part two of how to integrate JavaFX into the NetBeans platform wizard.
- Jason Lee has started to develop an AsciiDoc editor in JavaFX. You can check out the project over at bitbucket.
- Andy Moncsek has a post about using JacpFX clients with JSR 356 WebSockets.
- Jim Weaver and Thierry Wasylczenko were interviewed at Devoxx France, and the video is now available online for you to view.
- Robert Ladstätter has two posts this week. Firstly, he has posted part three on how to “use your webcam with JavaFX and OpenCV“. Secondly, he has a post on “using Scala Futures and OpenCV together with JavaFX“.
- Froglogic Squish (a commercial tool for UI test automation) has received an update that now adds support for JavaFX UI testing. I should note I’ve not used or even had access to this tool, but I am pleased that UI test automation is being worked on for JavaFX, hence the mention.
See – I told you it was a great list of links! 🙂 Catch you all next week, and keep up the great work.
Andy Moncsek
by Jasper Potts | May 1, 2013 | 3D
I just got a 3D Connexion SpaceNavigator which is a kind of 3D input device(mouse/stick). It is cool to use when 3D modeling content for JavaFX but I thought it would be even better if I could navigate my JavaFX 3D scenes using it. I managed to hack some quick code to get it working in JavaFX. Many thanks to the JInput project, they made it super easy. Its super fun so I recoded a little video to share with you.
SpaceNavigator with JavaFX from Jasper Potts on Vimeo.
The code really is very simple, I just have a AnimationTimer that every frame checks to get the current inputs from device and applies them to the camera transforms. The device via jinput provides 6 floats for each axis and 2 booleans for the buttons, so could not be easier to connect to your app. Below is complete 3D app with a simple cube. I will be working on getting the object importers out in open source for you to use very soon 🙂
public class InputTestBlog extends Application {
private ControllerEnvironment controllerEnvironment;
private Controller spaceNavigator;
private Component[] components;
private Translate translate;
private Rotate rotateX,rotateY,rotateZ;
@Override public void start(Stage stage) throws Exception {
controllerEnvironment = ControllerEnvironment.getDefaultEnvironment();
Controller[] controllers = controllerEnvironment.getControllers();
for(Controller controller: controllers){
if ("SpaceNavigator".equalsIgnoreCase(controller.getName())){
spaceNavigator = controller;
System.out.println("USING Device ["+controller.getName()+"] of type ["+controller.getType().toString()+"]");
components = spaceNavigator.getComponents();
}
}
Group root = new Group();
Scene scene = new Scene(root, 1024, 768, true);
stage.setScene(scene);
scene.setFill(Color.GRAY);
// CAMERA
final PerspectiveCamera camera = new PerspectiveCamera(true);
scene.setCamera(camera);
root.getChildren().add(camera);
// BOX
Box testBox = new Box(5,5,5);
testBox.setMaterial(new PhongMaterial(Color.RED));
testBox.setDrawMode(DrawMode.LINE);
root.getChildren().add(testBox);
// MOVE CAMERA
camera.getTransforms().addAll(
rotateY = new Rotate(-20, Rotate.Y_AXIS),
rotateX = new Rotate(-20, Rotate.X_AXIS),
rotateZ = new Rotate(0, Rotate.Z_AXIS),
translate = new Translate(5, -5, -15)
);
// SHOW STAGE
stage.show();
// CHECK FOR INPUT
if (spaceNavigator != null) {
new AnimationTimer() {
@Override public void handle(long l) {
if (spaceNavigator.poll()) {
for(Component component: components) {
switch(component.getName()) {
case "x":
translate.setX(translate.getX() + component.getPollData());
break;
case "y":
translate.setY(translate.getY()+component.getPollData());
break;
case "z":
translate.setZ(translate.getZ()+component.getPollData());
break;
case "rx":
rotateX.setAngle(rotateX.getAngle()+component.getPollData());
break;
case "ry":
rotateY.setAngle(rotateY.getAngle()+component.getPollData());
break;
case "rz":
rotateZ.setAngle(rotateZ.getAngle()+component.getPollData());
break;
}
}
}
}
}.start();
}
}
public static void main(String[] args) {
System.setProperty("net.java.games.input.librarypath", new File("lib").getAbsolutePath());
launch(args);
}
}