<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Blog @ SIB Visions &#187; JavaFX</title>
	<atom:link href="http://blog.sibvisions.com/tag/javafx/feed/" rel="self" type="application/rss+xml" />
	<link>https://blog.sibvisions.com</link>
	<description>Blog @ SIB Visions</description>
	<lastBuildDate>Mon, 30 Mar 2026 11:14:36 +0000</lastBuildDate>
		<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Maven central: JavaFX UI snapshots</title>
		<link>https://blog.sibvisions.com/2016/07/15/maven-central-javafx-ui-snapshots/</link>
		<comments>https://blog.sibvisions.com/2016/07/15/maven-central-javafx-ui-snapshots/#comments</comments>
		<pubDate>Fri, 15 Jul 2016 12:17:13 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=5749</guid>
		<description><![CDATA[Our JavaFX UI for JVx is available as maven snapshot:

&#60;dependency&#62; &#160; 
&#160; &#60;groupId&#62;com.sibvisions.jvx&#60;/groupId&#62; &#160; &#160;
&#160; &#60;artifactId&#62;jvxfx&#60;/artifactId&#62; &#160; 
&#160; &#60;version&#62;1.2-SNAPSHOT&#60;/version&#62; 
&#60;/dependency&#62;

or only JavaFX extensions

&#60;dependency&#62; &#160; 
&#160; &#60;groupId&#62;com.sibvisions.jvx&#60;/groupId&#62; &#160; &#160;
&#160; &#60;artifactId&#62;jfxtensions&#60;/artifactId&#62; &#160; 
&#160; &#60;version&#62;1.2-SNAPSHOT&#60;/version&#62; 
&#60;/dependency&#62;

and don't forget the snapshot repository:

&#60;repository&#62; &#160; 
&#160; &#60;id&#62;sonatype-nexus-snapshots&#60;/id&#62; &#160; &#160;
&#160; &#60;name&#62;Sonatype Snapshots&#60;/name&#62; &#160; 
&#160; &#60;url&#62;https://oss.sonatype.org/content/repositories/snapshots/&#60;/url&#62; 
&#60;/repository&#62;

]]></description>
			<content:encoded><![CDATA[<p>Our <a href="https://sourceforge.net/projects/jvxfx/">JavaFX UI for JVx</a> is available as maven snapshot:</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;dependency<span class="re2">&gt;</span></span></span> &nbsp; <br />
&nbsp; <span class="sc3"><span class="re1">&lt;groupId<span class="re2">&gt;</span></span></span>com.sibvisions.jvx<span class="sc3"><span class="re1">&lt;/groupId<span class="re2">&gt;</span></span></span> &nbsp; &nbsp;<br />
&nbsp; <span class="sc3"><span class="re1">&lt;artifactId<span class="re2">&gt;</span></span></span>jvxfx<span class="sc3"><span class="re1">&lt;/artifactId<span class="re2">&gt;</span></span></span> &nbsp; <br />
&nbsp; <span class="sc3"><span class="re1">&lt;version<span class="re2">&gt;</span></span></span>1.2-SNAPSHOT<span class="sc3"><span class="re1">&lt;/version<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/dependency<span class="re2">&gt;</span></span></span></div>
</div>
<p>or only JavaFX extensions</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;dependency<span class="re2">&gt;</span></span></span> &nbsp; <br />
&nbsp; <span class="sc3"><span class="re1">&lt;groupId<span class="re2">&gt;</span></span></span>com.sibvisions.jvx<span class="sc3"><span class="re1">&lt;/groupId<span class="re2">&gt;</span></span></span> &nbsp; &nbsp;<br />
&nbsp; <span class="sc3"><span class="re1">&lt;artifactId<span class="re2">&gt;</span></span></span>jfxtensions<span class="sc3"><span class="re1">&lt;/artifactId<span class="re2">&gt;</span></span></span> &nbsp; <br />
&nbsp; <span class="sc3"><span class="re1">&lt;version<span class="re2">&gt;</span></span></span>1.2-SNAPSHOT<span class="sc3"><span class="re1">&lt;/version<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/dependency<span class="re2">&gt;</span></span></span></div>
</div>
<p>and don't forget the snapshot repository:</p>
<div class="codesnip-container" >
<div class="xml codesnip" style="font-family:monospace;"><span class="sc3"><span class="re1">&lt;repository<span class="re2">&gt;</span></span></span> &nbsp; <br />
&nbsp; <span class="sc3"><span class="re1">&lt;id<span class="re2">&gt;</span></span></span>sonatype-nexus-snapshots<span class="sc3"><span class="re1">&lt;/id<span class="re2">&gt;</span></span></span> &nbsp; &nbsp;<br />
&nbsp; <span class="sc3"><span class="re1">&lt;name<span class="re2">&gt;</span></span></span>Sonatype Snapshots<span class="sc3"><span class="re1">&lt;/name<span class="re2">&gt;</span></span></span> &nbsp; <br />
&nbsp; <span class="sc3"><span class="re1">&lt;url<span class="re2">&gt;</span></span></span>https://oss.sonatype.org/content/repositories/snapshots/<span class="sc3"><span class="re1">&lt;/url<span class="re2">&gt;</span></span></span> <br />
<span class="sc3"><span class="re1">&lt;/repository<span class="re2">&gt;</span></span></span></div>
</div>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2016/07/15/maven-central-javafx-ui-snapshots/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Effiziente Software Entwicklung mit JavaFX und JVx</title>
		<link>https://blog.sibvisions.com/2016/03/23/effiziente-software-entwicklung-mit-javafx-und-jvx/</link>
		<comments>https://blog.sibvisions.com/2016/03/23/effiziente-software-entwicklung-mit-javafx-und-jvx/#comments</comments>
		<pubDate>Wed, 23 Mar 2016 13:48:45 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Media]]></category>
		<category><![CDATA[JavaAktuell]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=5581</guid>
		<description><![CDATA[



Ein spannender Artikel über JVx und JavaFX ist im aktuellen JavaAktuell zu finden.
Der Artikel wurde von Roland Hörmann verfasst und behandelt das Thema Effiziente Software Entwicklung mit Java und insbesondere mit JavaFX bzw. dem OpenSource Java Framework JVx.
Wer das Magazin nicht zur Hand hat, kann den Artikel auch von hier laden und sofort lesen.


]]></description>
			<content:encoded><![CDATA[<table>
<tr>
<td><a href="http://blog.sibvisions.com/wp-content/uploads/2016/03/02-2016-Java_Effiziente-Software-Entwicklung-mit-JavaFX-und-JVx.pdf"><img src="http://blog.sibvisions.com/wp-content/uploads/2016/03/javaaktuell2016.png" alt="javaaktuell2016" title="javaaktuell2016" width="177" height="250" class="aligncenter size-full wp-image-5582" style="padding: 5px;"/></a></td>
<td style="width: 5px;"></td>
<td style="padding: 5px;">Ein spannender Artikel über JVx und JavaFX ist im aktuellen <a href="http://www.ijug.eu/java-aktuell/das-magazin.html">JavaAktuell</a> zu finden.</p>
<p>Der Artikel wurde von Roland Hörmann verfasst und behandelt das Thema <strong>Effiziente Software Entwicklung mit Java</strong> und insbesondere mit JavaFX bzw. dem OpenSource Java Framework <a href="http://jvx.sibvisions.com/">JVx</a>.</p>
<p>Wer das Magazin nicht zur Hand hat, kann den Artikel auch von <a href="http://blog.sibvisions.com/wp-content/uploads/2016/03/02-2016-Java_Effiziente-Software-Entwicklung-mit-JavaFX-und-JVx.pdf">hier</a> laden und sofort lesen.</td>
</tr>
</table>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2016/03/23/effiziente-software-entwicklung-mit-javafx-und-jvx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Our nice JavaFX mobile applications</title>
		<link>https://blog.sibvisions.com/2015/11/28/5250/</link>
		<comments>https://blog.sibvisions.com/2015/11/28/5250/#comments</comments>
		<pubDate>Sat, 28 Nov 2015 17:03:03 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JavaFX mobile]]></category>
		<category><![CDATA[JavaFXPorts]]></category>
		<category><![CDATA[JVx]]></category>
		<category><![CDATA[RoboVM]]></category>
		<category><![CDATA[VisionX]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=5250</guid>
		<description><![CDATA[Our (research) projects with JavaFX are almost finished. We have awesome results and everything is production ready. The only drop of bitterness is the performance of JavaFX on desktops and mobile devices, but this can be improved by Oracle. It's not in our hands.
What do we have?
We have 

a complete JavaFX UI for JVx
a custom [...]]]></description>
			<content:encoded><![CDATA[<p>Our (research) projects with JavaFX are almost finished. We have awesome results and everything is production ready. The only drop of bitterness is the performance of JavaFX on desktops and mobile devices, but this can be improved by Oracle. It's not in our hands.</p>
<p><strong>What do we have?</strong></p>
<p>We have </p>
<ul>
<li>a complete JavaFX UI for JVx</li>
<li>a custom application frame for mobile applications</li>
<li>Live CSS manipulation of installed apps (needs debug build)</li>
<li>Complete Project export for JavaFX mobile projects (JavaFXPorts based gradle project),<br />
integrated in upcoming VisionX 2.3</li>
<li>Remote Work-screen loading (via VisionX)</li>
<li>JVx server runs without limitations on mobile devices</li>
<li>JVx client runs on mobile devices (for network clients)</li>
</ul>
<p><strong>How does it look like?</strong></p>
<p>I have some screenshots from two applications. The first one is a standalone JVx application. The whole JVx framework runs on the mobile device. The app is a remote control for our eTV project (it's a brand new side project of our research team).</p>
<p>The app was inspired by MS Metro style ... Windows8 style ... Modern ... Universal ... Windows Store ... Windows apps.</p>
<p>The main screen has some buttons to control our eTV and some buttons open a "popup" with additional options:</p>
<table>
<tr>
<td><div id="attachment_5252" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/11/eTVmain.jpg" rel="lightbox[5250]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/11/eTVmain-300x225.jpg" alt="eTV Dashboard" title="eTVmain" width="300" height="225" class="size-medium wp-image-5252" /></a><p class="wp-caption-text">eTV Dashboard</p></div></td>
<td style="width: 15px;"></td>
<td><div id="attachment_5251" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/11/eTV_windows.jpg" rel="lightbox[5250]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/11/eTV_windows-300x225.jpg" alt="eTV Window view" title="eTV_windows" width="300" height="225" class="size-medium wp-image-5251" /></a><p class="wp-caption-text">eTV Window view</p></div></td>
</tr>
<tr>
<td><div id="attachment_5253" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/11/eTV_gallery.jpg" rel="lightbox[5250]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/11/eTV_gallery-300x225.jpg" alt="eTV Gallery" title="eTV_gallery" width="300" height="225" class="size-medium wp-image-5253" /></a><p class="wp-caption-text">eTV Gallery</p></div></td>
<td></td>
<td></td>
</tr>
<tr>
<td style="height: 25px;"></td>
</tr>
</table>
<p>The second app will be shown as Video, because we want to demonstrate how we use VisionX to create backoffice apps in under 5 minutes! The app itself isn't complex and does "nothing special", but the same mechanism works for complex applications like our Demo ERP system (read our <a href="http://blog.sibvisions.com/2015/10/21/code-once-run-anywhere/">Code once. Run anywhere</a> post).</p>
<p>Our JavaFX mobile project was based on the great work of Gluon and their <a href="http://www.javafxports.org">JavaFXPorts</a> OpenSource project and also on <a href="http://robovm.com/">RoboVM</a>.</p>
<p><center><div class="wp-caption aligncenter nomargin" style="width: 570px"><iframe width="560" height="315" src="https://www.youtube.com/embed/AimY_PkiHQE" frameborder="0" allowfullscreen></iframe><p class="wp-caption-text">JavaFX mobile LIVE CSS hacking</p></div><br />
</center><br />
<em>(The video lasts 05:19 but it should be 07:30 because the build process takes 02:50. We shortened the build process because it's boring to wait.)</em></p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/11/28/5250/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The future of JavaFX?</title>
		<link>https://blog.sibvisions.com/2015/11/23/the-future-of-javafx/</link>
		<comments>https://blog.sibvisions.com/2015/11/23/the-future-of-javafx/#comments</comments>
		<pubDate>Mon, 23 Nov 2015 15:46:41 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Gluon]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JavaFXPorts]]></category>
		<category><![CDATA[JVx]]></category>
		<category><![CDATA[RoboVM]]></category>
		<category><![CDATA[Vaadin]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=5215</guid>
		<description><![CDATA[After one year of JavaFX development, we thought it's time to write about our experience. 
We started in Nov. 2014 with our first bigger JavaFX tests. The idea was an UI implementation for JVx. We thought it should be an easy task because JavaFX is a desktop technology. We had another research project in 2012, [...]]]></description>
			<content:encoded><![CDATA[<p>After one year of JavaFX development, we thought it's time to write about our experience. </p>
<p>We started in Nov. 2014 with our first bigger JavaFX tests. The idea was an UI implementation for JVx. We thought it should be an easy task because JavaFX is a desktop technology. We had another research project in 2012, but the result wasn't as expected. Sometimes it's a good idea to re-start from scratch!</p>
<p>JavaFX wasn't very popular and is still not a Superstar, but we love researching and we thought it might be a good idea to bet on JavaFX. Not only as pure desktop solution and Swing replacement, but also for mobile app development based on JavaFXPorts and for embedded devices, like Raspberry Pi. So we had this big picture in mind.<br />
We thought it would be awesome to create a single JavaFX application, for all platforms and devices. Sure, some other companies tried to solve this problem as well, but we didn't try to do the same. Our idea was simple and based on JVx. We hade this awesome JVx application framework which enabled GUI and technology independent application development. So we tried to solve the GUI problem because all other things like persistence, remote communcation, i18n, ... were already solved by JVx.</p>
<p>We did different GUI implementations for JVx, before we started with JavaFX. Our first one was based on Swing, followed by QTJambi, GWT, GXT, a headless variant and - last but not least - vaadin. We also made some tests with Flex and Pivot, but we didn't create more than some simple PoC. To be clear: GUI technology know-how was not the problem!</p>
<p>We knew that JavaFX didn't have a solution for MDI and especially a DesktopPane was missing, but it wasn't a problem to create custom components/controls. We had some hard months of development because we found out that JavaFX wasn't a mature toolkit like Swing. We had to find many workarounds for very simple problems and had to create more custom components than expected. We solved most problems in our own code, but it wasn't possible to change some basic problems. We tried to get in contact with the developers, via JIRA, but it was hard to explain real-world use-cases to toolkit developers. Our developers at SIB Visions create custom products and projects together with customers for their needs. So we had many UI toolkit requirements from real users. Some issues were accepted but not all. Many bugs were fixed but we had big problems with Feature Requests. So far so good.</p>
<p>We finished our JavaFX UI implementation in April 2015 and it was a big success, because we had a fresh UI technology with lots new features and animations, transitions, web and media views, .... awesome.</p>
<p>We thought that JavaFX will be improved in 2015/2016 and it will be mature enough to use it for our customers.</p>
<p><strong>Wait... what's the problem with JavaFX?</strong></p>
<p><strong>Performance</strong>, <strong>Memory</strong>, <strong>limited chances to modify standard controls</strong></p>
<p>The performance is not good, if you have many controls (= nodes). It's different on Windows, Linux, MacOS. It's much better on MacOS than on any other supported OS. If you develop business/backoffice applications, the performance is very important. Sure, if you create simple form based applications, it doesn't really matter.</p>
<p>We use JVx to develop huge backoffice applications and currently, JavaFX should be used with care.</p>
<p>What do we mean with "performance is not good"? </p>
<ul>
<li>Large TableViews have scroll delays</li>
<li>Layouting sometimes need some "extra repaints"</li>
<li>Scrolling with many controls is not immediate</li>
<li>Startup time of an application is too long, compared to e.g. Swing applications</li>
</ul>
<p><em>The version number of JavaFX 8 is too high for it's maturity.</em></p>
<p><strong>JavaFX has big potential but we're not sure if it'll survive it's predecessor Swing.</strong></p>
<p>And we're not alone with our opinion: <a href="https://www.codenameone.com/blog/should-oracle-spring-clean-javafx.html">Should Oracle Spring clean JavaFX</a></p>
<p>But there are also companies with JavaFX applications: <a href="https://dlemmermann.wordpress.com/2015/11/20/javafx-real-world-apps-javaone-2015-presentation-online/">JavaFX Real-world apps</a></p>
<h4 style="padding-top: 15px">There's more</h4>
<p>The toolkit issues are one thing. Another big surprise was that Oracle stopped official ARM support in Jan 2015 which didn't mean that JavaFX doesn't run on ARM devices (RaspberryPi, ...), but it's not officially supported and Oracle doesn't fix bugs or implement improvements.<br />
Thanks to <a href="http://gluonhq.com/open-source/javafxports/downloads/">Gluon</a> it's still very easy to use JavaFX on ARM devices.</p>
<p><em>Another step backwards was the migration to Bugzilla.</em> In 2014 (and earlier), JavaFX was a "newcomer" and announced as Swing replacement. The development process at Oracle was very open and you had a "direct connection" to the development team, or something like that. It was very simple to report issues and to get feedback from the developers. It was fantastic to see and feel the progress. This is different nowadays, because the ticketing system moved from JIRA to Bugzilla and it's more or less readonly for standard developers.</p>
<p><strong>One problem with JavaFX is that Oracle doesn't tell us the strategy behind JavaFX</strong>. The investment of Oracle in JavaFX was high, but what will be the next step? It's hard to bet on JavaFX without definitive commitment from Oracle.</p>
<p>But we still hope that JavaFX will be the one and only UI toolkit for Java. </p>
<h4 style="padding-top: 15px">JavaFX for Android and iOS</h4>
<p>In summer, we moved forward and tried to use <a href="http://gluonhq.com/open-source/javafxports/">JavaFXPorts</a>. It makes it possible to use your JavaFX application as native Android and iOS apps. Our JavaFX UI worked with some smaller changes out-of-the-box. It was awesome to see our JVx on Android or iOS devices! It was a milestone.</p>
<p>But things have changed since summer because JavaFXPorts has a depency on <a href="https://robovm.com/">RoboVM</a>. It was an OpenSource project and was a big win for the community. But now it's a commercial tool (<a href="https://robovm.com/robovm-acquired-by-world-leader-in-cross-platform-mobile-xamarin/">read more</a>). This has no impact for us, but means that we can't offer an out-of-the-box OpenSource solution. </p>
<p>JavaFXPorts also works without RoboVM and there are plans for a <a href="http://gluonhq.com/gluon-supports-multiple-jvms/">JVM running on mobile devices</a>, but this won't solve the problem that you need access to device features/APIs. But we'll see what happens in the next few months.</p>
<p>We had some fun in the last few weeks because we tuned our application frame for mobile devices. A mobile application has some specific characteristics and isn't a 1:1 desktop application. A desktop application usually has a menubar and a toolbar. The same app on a mobile device shouldn't use a menubar or toolbar. It should offer a hamburger button which offers a custom menu. Also the style of the controls should be different on mobile devices, e.g. Tabsets.</p>
<p>There are two interesting projects which offer custom mobile controls. The first is a commercial product, from Gluon and the second one is <a href="http://jfoenix.com/">JFoenix</a> and it's OpenSource (LGPL). We took JFoenix because it met our requirements and JVx is OpenSource.</p>
<p>We have some screenshots in older posts: </p>
<ul>
<li><a href="http://blog.sibvisions.com/2015/10/21/code-once-run-anywhere/">Code once. Run anywhere</a></li>
<li><a href="http://blog.sibvisions.com/2015/10/28/details-about-live-css-hacking/">Live CSS hacking</a></li>
</ul>
<h4 style="padding-top: 15px">Resume</h4>
<p>JavaFX has potential to rule the Java UI world, but it needs an official commitment/statement from Oracle. Now it's unclear if JavaFX is the right UI technology for the future.</p>
<p>We hope that JavaFX is the right toolkit, but we aren't sure. Our investment was risky and high, but no risk - no fun. The results are awesome!</p>
<p>Thanks to JVx the UI technology is not important for us, because if JavaFX won't make the race, we still have Swing or vaadin. It's important to be UI technology independent because it saves time and money and is future save.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/11/23/the-future-of-javafx/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Details about LIVE css hacking</title>
		<link>https://blog.sibvisions.com/2015/10/28/details-about-live-css-hacking/</link>
		<comments>https://blog.sibvisions.com/2015/10/28/details-about-live-css-hacking/#comments</comments>
		<pubDate>Wed, 28 Oct 2015 13:55:27 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=5134</guid>
		<description><![CDATA[We have a short video about our LIVE css hacking feature for mobile JavaFX applications on YouTube:
]]></description>
			<content:encoded><![CDATA[<p>We have a <a href="https://www.youtube.com/watch?v=fnooIzGUxFk">short video about our LIVE css hacking</a> feature for mobile JavaFX applications on YouTube:</p>
<p><center><div class="wp-caption aligncenter nomargin" style="width: 570px"><iframe width="560" height="315" src="https://www.youtube.com/embed/fnooIzGUxFk" frameborder="0" allowfullscreen></iframe><p class="wp-caption-text">JavaFX mobile LIVE CSS hacking</p></div><br />
</center></p>
<p>We demonstrate a mobile JavaFX application, running on a Nexus 9 Tablet. It's a pure JavaFX application with our mobile application frame and it was deployed with JavaFXPorts. In the video, we change some styles on our Laptop and the application updates its styles on demand. This is really useful because resolution/screen size can be different. Sometimes the background color looks different than on a Desktop, ... And it's easy to try out new styles without application restarts - same principle as developer tools for Chrome or FireBug for Firefox.</p>
<p><strong>But how did we implement this feature?</strong></p>
<p>It was too easy <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
<p>Here are the "secrets":</p>
<ul>
<li>A simple socket server for the application</li>
<li>A custom URL handler for loading remote-retrieved styles</li>
<li>A simple File watcher for the client</li>
</ul>
<p>That's it!</p>
<p>But to be honest, the custom URL handler was very tricky, because we tried to find a very smart, non-static, solution. And every platform has its specific handling and URL loading mechanism. But one step after another.</p>
<p>I guess you know that a socket server isn't a real problem. We wrote our own "generic" socket server some years ago, for JVx and it's not tricky. In principle, it works like this snippet:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw3">ServerSocket</span> serverSocket <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">ServerSocket</span><span class="br0">&#40;</span>9999<span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">Socket</span> clientSocket <span class="sy0">=</span> serverSocket.<span class="me1">accept</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p><span class="kw3">PrintWriter</span> out <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">PrintWriter</span><span class="br0">&#40;</span>clientSocket.<span class="me1">getOutputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="kw2">true</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
<span class="kw3">BufferedReader</span> in <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">BufferedReader</span><span class="br0">&#40;</span><span class="kw1">new</span> <span class="kw3">InputStreamReader</span><span class="br0">&#40;</span>clientSocket.<span class="me1">getInputStream</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>The problem is that you need a sort of protocol for the content. We've used our UniversalSerializer and send simple POJOs. The stylesheet POJO contains the css file as byte[]. Here's our server code:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">CommunicationServer server <span class="sy0">=</span> <span class="kw1">new</span> CommunicationServer<span class="br0">&#40;</span>findHost<span class="br0">&#40;</span><span class="br0">&#41;</span>, 9999<span class="br0">&#41;</span><span class="sy0">;</span><br />
server.<span class="me1">addReceiver</span><span class="br0">&#40;</span>r <span class="sy0">-&gt;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; javafx.<span class="me1">application</span>.<span class="me1">Platform</span>.<span class="me1">runLater</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-&gt;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span> <span class="br0">&#40;</span>oSync<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>sLastCss <span class="sy0">!=</span> <span class="kw2">null</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;Remove remote CSS file &quot;</span>, sLastCss<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; launcher.<span class="me1">getScene</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStylesheets</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">remove</span><span class="br0">&#40;</span><span class="st0">&quot;remotecss://&quot;</span> <span class="sy0">+</span> sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectCache.<span class="me1">remove</span><span class="br0">&#40;</span>sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; sLastCss <span class="sy0">=</span> ObjectCache.<span class="me1">createKey</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">+</span> <span class="st0">&quot;.css&quot;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ObjectCache.<span class="me1">put</span><span class="br0">&#40;</span>sLastCss, r.<span class="me1">getObject</span><span class="br0">&#40;</span><span class="br0">&#41;</span>, <span class="sy0">-</span>1<span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; logger.<span class="me1">info</span><span class="br0">&#40;</span><span class="st0">&quot;Install remote CSS file &quot;</span>, sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; launcher.<span class="me1">getScene</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getStylesheets</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">add</span><span class="br0">&#40;</span><span class="st0">&quot;remotecss://&quot;</span> <span class="sy0">+</span> sLastCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">null</span><span class="sy0">;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
server.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>We add custom stylesheets with <em>remotecss</em> as protocol. The resource loading mechanism of Java(FX) tries to load the URL automatically. The protocol isn't a standard protocol and so we had to create a custom URL handler. The problem wasn't the handler itself because it's straight forward:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> Handler <span class="kw1">extends</span> <span class="kw3">URLStreamHandler</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; <span class="kw1">protected</span> <span class="kw3">URLConnection</span> openConnection<span class="br0">&#40;</span><span class="kw3">URL</span> url<span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>url.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">toLowerCase</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">endsWith</span><span class="br0">&#40;</span><span class="st0">&quot;.css&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> CssURLConnection<span class="br0">&#40;</span>url<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> <span class="kw3">FileNotFoundException</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>And the <em>CssURLConnection</em> also wasn't a problem:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">private</span> <span class="kw1">class</span> CssURLConnection <span class="kw1">extends</span> <span class="kw3">URLConnection</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw1">public</span> CssURLConnection<span class="br0">&#40;</span><span class="kw3">URL</span> pUrl<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">super</span><span class="br0">&#40;</span>pUrl<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> connect<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; @Override<br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw3">InputStream</span> getInputStream<span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="kw1">throws</span> <span class="kw3">IOException</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">Object</span> oCss <span class="sy0">=</span> ObjectCache.<span class="me1">get</span><span class="br0">&#40;</span>getURL<span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">getHost</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>oCss <span class="kw1">instanceof</span> <span class="kw3">String</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <span class="kw3">ByteArrayInputStream</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw3">String</span><span class="br0">&#41;</span>oCss<span class="br0">&#41;</span>.<span class="me1">getBytes</span><span class="br0">&#40;</span><span class="st0">&quot;UTF-8&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>oCss <span class="kw1">instanceof</span> <span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw1">new</span> <span class="kw3">ByteArrayInputStream</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="kw4">byte</span><span class="br0">&#91;</span><span class="br0">&#93;</span><span class="br0">&#41;</span>oCss<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">throw</span> <span class="kw1">new</span> <span class="kw3">FileNotFoundException</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span> &nbsp; &nbsp;<br />
<span class="br0">&#125;</span></div>
</div>
<p>The problem was that the JVM didn't know how to load <em>remotecss://</em> URLs because it doesn't have a default handler. The JVM offers different solutions for this problem and the well known is:</p>
<div class="codesnip-container" >URL.setURLStreamHandlerFactory(factory);</div>
<p>But this is a static mechanism and we didn't know if another library uses the same method. There's no getURLStreamHandlerFactory in URL and the solution wasn't good enough for us. For a simple test application this restriction shouldn't be a problem, but we didn't like it because we're framework developers.</p>
<p>There's another solution for the problem, because the source code of URL contains the static method:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">static</span> <span class="kw3">URLStreamHandler</span> getURLStreamHandler<span class="br0">&#40;</span><span class="kw3">String</span> protocol<span class="br0">&#41;</span></div>
</div>
<p>This method tries to load protocol handlers automatically, if definded via system property <em><strong>java.protocol.handler.pkgs</strong></em> or from package: sun.net.www.protocol.<strong>protocolname</strong>.<strong>Handler</strong></p>
<p>After reading the source code, we found a blogpost about this feature, <a href="http://mjremijan.blogspot.co.at/2012/02/create-your-own-java-url-handlers.html">read more</a>. It was easy to search with the right keyword after we knew the solution.</p>
<p>...be careful with security manager, but this shouldn't matter.</p>
<p>The URL implementation for Android is a little bit different because but if you set the system property, it'll work as expected.</p>
<p>The hardest parts were done and the last thing was the file watcher client because we planned to send the changed CSS file(s) to the app automatically. Here's our solution (Java8 style):</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;">thWatcher <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">Thread</span><span class="br0">&#40;</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">-&gt;</span> <br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <span class="kw3">File</span> fi <span class="sy0">=</span> ResourceUtil.<span class="me1">getFileForClass</span><span class="br0">&#40;</span><span class="st0">&quot;/live.css&quot;</span><span class="br0">&#41;</span>.<span class="me1">getParentFile</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; FileSystem fsys <span class="sy0">=</span> FileSystems.<span class="me1">getDefault</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; Path pathCss <span class="sy0">=</span> fsys.<span class="me1">getPath</span><span class="br0">&#40;</span>fi.<span class="me1">getAbsolutePath</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span> <span class="br0">&#40;</span><span class="kw1">final</span> WatchService service <span class="sy0">=</span> fsys.<span class="me1">newWatchService</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WatchKey wkey <span class="sy0">=</span> pathCss.<span class="me1">register</span><span class="br0">&#40;</span>service, StandardWatchEventKinds.<span class="me1">ENTRY_MODIFY</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="br0">&#40;</span><span class="sy0">!</span>ThreadHandler.<span class="me1">isStopped</span><span class="br0">&#40;</span>thWatcher<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; WatchKey key <span class="sy0">=</span> service.<span class="me1">take</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>WatchEvent<span class="sy0">&lt;?&gt;</span> event <span class="sy0">:</span> key.<span class="me1">pollEvents</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Kind<span class="sy0">&lt;?&gt;</span> kind <span class="sy0">=</span> event.<span class="me1">kind</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>kind <span class="sy0">==</span> StandardWatchEventKinds.<span class="me1">ENTRY_MODIFY</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; Path changed <span class="sy0">=</span> <span class="br0">&#40;</span>Path<span class="br0">&#41;</span>event.<span class="me1">context</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>changed.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span>.<span class="me1">equals</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getName</span><span class="br0">&#40;</span><span class="kw3">CSS</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">File</span> fiModified <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">File</span><span class="br0">&#40;</span>fi, changed.<span class="me1">toString</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>fiModified.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span> <span class="sy0">&gt;</span> 0<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span>lLastModified <span class="sy0">!=</span> fiModified.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client <span class="sy0">=</span> getClient<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client.<span class="me1">send</span><span class="br0">&#40;</span>FileUtil.<span class="me1">getContent</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>ResourceUtil.<span class="me1">getResourceAsStream</span><span class="br0">&#40;</span><span class="st0">&quot;/live.css&quot;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; lLastModified <span class="sy0">=</span> fiModified.<span class="me1">lastModified</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">System</span>.<span class="me1">out</span>.<span class="me1">println</span><span class="br0">&#40;</span><span class="st0">&quot;Sent CSS to application&quot;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="co1">// next try</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; client <span class="sy0">=</span> CommonUtil.<span class="me1">close</span><span class="br0">&#40;</span>client<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span> <span class="kw1">if</span> <span class="br0">&#40;</span>kind <span class="sy0">==</span> StandardWatchEventKinds.<span class="me1">OVERFLOW</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">continue</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="sy0">!</span>key.<span class="me1">reset</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; thWatcher <span class="sy0">=</span> ThreadHandler.<span class="me1">stop</span><span class="br0">&#40;</span>thWatcher<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; wkey.<span class="me1">reset</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="kw1">catch</span> <span class="br0">&#40;</span><span class="kw3">Exception</span> e<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; e.<span class="me1">printStackTrace</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">synchronized</span> <span class="br0">&#40;</span>TestCommunication.<span class="kw1">this</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; TestCommunication.<span class="kw1">this</span>.<span class="me1">notify</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span><span class="br0">&#41;</span><span class="sy0">;</span></p>
<p>thWatcher.<span class="me1">start</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span><br />
ThreadHandler.<span class="me1">add</span><span class="br0">&#40;</span>thWatcher<span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>The source code examples aren't complete but I guess you can implement your own solution based on them. We made tests with iOS,  Android and Desktop applications and didn't have any problems. The CSS editing feature would be a very useful extension for ScenicView but it's not available right now.</p>
<p>Our test devices:</p>
<div id="attachment_5145" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/10/ERP_different_devices.jpg" rel="lightbox[5134]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/10/ERP_different_devices-300x225.jpg" alt="Test devices" title="ERP_different_devices" width="300" height="225" class="size-medium wp-image-5145" /></a><p class="wp-caption-text">CSS hacking - test devices</p></div>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/10/28/details-about-live-css-hacking/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaFXPorts with Eclipse</title>
		<link>https://blog.sibvisions.com/2015/09/22/javafxports-with-eclipse/</link>
		<comments>https://blog.sibvisions.com/2015/09/22/javafxports-with-eclipse/#comments</comments>
		<pubDate>Tue, 22 Sep 2015 14:59:25 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[Eclipse]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JavaFXPorts]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=5027</guid>
		<description><![CDATA[Some weeks ago, Gluon released the first version of their Eclipse plugin...]]></description>
			<content:encoded><![CDATA[<p>Some weeks ago, Gluon released the first version of their <a href="http://gluonhq.com/the-new-gluon-plugin-for-eclipse/">Eclipse plugin</a> for creating/building mobile applications with Java(FX).</p>
<p>We had some experience with their NetBeans plugin but our preferred IDE was Eclipse. So, an Eclipse plugin was good for us <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /><br />
The NetBeans version worked without bigger problems and we expected the same quality for the Eclipse plugin.</p>
<p>We followed the <a href="http://gluonhq.com/the-new-gluon-plugin-for-eclipse/">official installation instructions</a> and didn't have any problem. But the problems started after we tried to create Android or iOS specific code. It wasn't possible to access javafxports, android or robovm classes, because the jar files weren't found. The classpath with NetBeans had references to all libraries, but the Eclipse project didn't have such references.</p>
<p>We tried to find some information in the documentation and found the NFC example application. The <a href="https://bitbucket.org/johanvos/androidnfcreader/src/c2f6ef73afaf8d1ad918cce3796d1886b1683276/build.gradle?at=default&#038;fileviewer=file-view-default">build file</a> had additional dependencies for android and javafxports. We changed the build file of our Eclipse project:</p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">dependencies <span class="br0">&#123;</span><br />
&nbsp; &nbsp; compile files<span class="br0">&#40;</span><span class="st0">&quot;C:/tools/android/android-sdk_r04-windows/platforms/android-21/android.jar&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; compile <span class="st0">&quot;org.javafxports:jfxdvk:8u60-b3&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; compile fileTree<span class="br0">&#40;</span>dir<span class="sy0">:</span> <span class="st0">'libs'</span><span class="sy0">,</span> include<span class="sy0">:</span> <span class="st0">'*.jar'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; runtime fileTree<span class="br0">&#40;</span>dir<span class="sy0">:</span> <span class="st0">'libs'</span><span class="sy0">,</span> include<span class="sy0">:</span> <span class="st0">'*.jar'</span><span class="br0">&#41;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>and after some Gradle/Refresh Dependencies, Refresh All clicks, all Errors were fixed!<br />
It was horrible, because after clicking Refresh Dependencies, nothing happened and after some more clicks, all errors were gone. Not sure if this was a Gradle project problem, or Gluon plugin problem.</p>
<p>Our full build script (without robovm):</p>
<div class="codesnip-container" >
<div class="javascript codesnip" style="font-family:monospace;">buildscript <span class="br0">&#123;</span><br />
&nbsp; &nbsp; repositories <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; jcenter<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; dependencies <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; classpath <span class="st0">'org.javafxports:jfxmobile-plugin:1.0.1'</span></p>
<p>&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></p>
<p>apply plugin<span class="sy0">:</span> <span class="st0">'org.javafxports.jfxmobile'</span></p>
<p>repositories <span class="br0">&#123;</span><br />
&nbsp; &nbsp; jcenter<span class="br0">&#40;</span><span class="br0">&#41;</span><br />
<span class="br0">&#125;</span></p>
<p>dependencies <span class="br0">&#123;</span><br />
&nbsp; &nbsp; compile files<span class="br0">&#40;</span><span class="st0">&quot;C:/tools/android/android-sdk_r04-windows/platforms/android-21/android.jar&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; compile <span class="st0">&quot;org.javafxports:jfxdvk:8u60-b3&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; compile fileTree<span class="br0">&#40;</span>dir<span class="sy0">:</span> <span class="st0">'libs'</span><span class="sy0">,</span> include<span class="sy0">:</span> <span class="st0">'*.jar'</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; runtime fileTree<span class="br0">&#40;</span>dir<span class="sy0">:</span> <span class="st0">'libs'</span><span class="sy0">,</span> include<span class="sy0">:</span> <span class="st0">'*.jar'</span><span class="br0">&#41;</span><br />
<span class="br0">&#125;</span></p>
<p>mainClassName <span class="sy0">=</span> <span class="st0">'com.sibvisions.mobilefx.android.DemoERPApplication'</span><br />
&nbsp; &nbsp; <br />
jfxmobile <span class="br0">&#123;</span><br />
&nbsp; &nbsp; ios <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; forceLinkClasses <span class="sy0">=</span> <span class="br0">&#91;</span> <span class="st0">'com.sibvisions.mobilefx.ios.**.*'</span> <span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; android <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; androidSdk <span class="sy0">=</span> <span class="st0">'C:/tools/android/android-sdk_r04-windows'</span><br />
&nbsp; &nbsp; &nbsp; compileSdkVersion <span class="sy0">=</span> <span class="nu0">21</span> &nbsp;<br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<div style="padding-top: 15px"><i>Hints</i></div>
<ul>
<li><a href="http://www.androidcentral.com/how-enable-developer-settings-android-42">Enable developer options</a> for your Android device</li>
<li>Show log messages from your Android device: <em><ANDROID_HOME>\platform-tools\adb logcat</em></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/09/22/javafxports-with-eclipse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaFXPorts with iOS</title>
		<link>https://blog.sibvisions.com/2015/07/09/javafxports-with-ios/</link>
		<comments>https://blog.sibvisions.com/2015/07/09/javafxports-with-ios/#comments</comments>
		<pubDate>Thu, 09 Jul 2015 14:31:29 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JavaFXPorts]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=4714</guid>
		<description><![CDATA[I wrote a blog post about JavaFXPorts and Android some weeks ago.
At last Eclipse DemoCamp in Vienna, Tom Schindl asked me about the startup performance on iOS, because his experience with startup performance was horrible with early RoboVM versions. I had no answer because we didn't test our app with iOS and... the question didn't [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote a blog post about <a href="http://blog.sibvisions.com/2015/04/08/jvx-javafx-ui-with-javafxports/">JavaFXPorts and Android</a> some weeks ago.</p>
<p>At last Eclipse DemoCamp in Vienna, Tom Schindl asked me about the startup performance on iOS, because his experience with startup performance was horrible with early RoboVM versions. I had no answer because we didn't test our app with iOS and... the question didn't get ouf of my head. Sure, I knew that RoboVM was tuned in last two versions but didn't test it myself.</p>
<p>So, yesterday I had the time to test it out and... Startup and overall performance was same as on Android device!<br />
The iOS device was an iPad Air2 and Android device was Nexus9. The performance may be worse on older devices.<br />
Performance? Application start was finished after touch event (< 1 sec).</p>
<p>My test wasn't as simple as expected because RoboVM has some specifics and iOS needs code signing in order to run an app on real hardware. Also my  JVx library (jvx.jar) wasn't usable because it contained SwingUI and one class of it was accessing a member of a parent class:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">public</span> <span class="kw1">class</span> JVxCalendarPane <span class="kw1">extends</span> <span class="kw3">JPanel</span><br />
<span class="br0">&#123;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; ...<br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">public</span> <span class="kw4">void</span> addActionListener<span class="br0">&#40;</span><span class="kw3">ActionListener</span> pActionListener<span class="br0">&#41;</span> <br />
&nbsp; &nbsp; <span class="br0">&#123;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; listenerList.<span class="me1">add</span><span class="br0">&#40;</span><span class="kw3">ActionListener</span>.<span class="kw1">class</span>, pActionListener<span class="br0">&#41;</span><span class="sy0">;</span><br />
&nbsp; &nbsp; <span class="br0">&#125;</span><br />
<span class="br0">&#125;</span></div>
</div>
<p>The listenerList is a member of JComponent:</p>
<div class="codesnip-container" >
<div class="java codesnip" style="font-family:monospace;"><span class="kw1">protected</span> <span class="kw3">EventListenerList</span> listenerList <span class="sy0">=</span> <span class="kw1">new</span> <span class="kw3">EventListenerList</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="sy0">;</span></div>
</div>
<p>But the member is not available in RoboVM' phantom class. The solution was easy: Removing SwingUI from jar.<br />
A nice feature for RoboVM would be an ignore list of classes/packages.</p>
<p>Here's a picture of our DemoERP application on iOS:</p>
<div id="attachment_4725" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/07/ios_erp.jpg" rel="lightbox[4714]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/07/ios_erp-300x225.jpg" alt="DemoERP on iOS tablet" title="ios_erp" width="300" height="225" class="size-medium wp-image-4725" /></a><p class="wp-caption-text">DemoERP on iOS tablet</p></div>
<p>It's working <img src='https://blog.sibvisions.com/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  but still, a Desktop application 1:1 on a tablet isn't the best idea, e.g. the device type (iPad) or WLAN icon is over the application menu. The iOS port has some problems with TextFields, but we'll report an issue.</p>
<p>Thanks to <a href="http://javafxports.org/page/home">JavaFXports</a> the creation and deployment of our JavaFX app was super easy!</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/07/09/javafxports-with-ios/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaFX UI and VisionX</title>
		<link>https://blog.sibvisions.com/2015/06/29/javafx-ui-and-visionx/</link>
		<comments>https://blog.sibvisions.com/2015/06/29/javafx-ui-and-visionx/#comments</comments>
		<pubDate>Mon, 29 Jun 2015 10:40:12 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[VisionX]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=4611</guid>
		<description><![CDATA[We've good news for you. Since our JavaFX UI has reached version 1.0, we thought it might be a good idea to integrate the UI into VisionX. It wasn't that easy because JavaFX needs Java8 and VisionX runs with Java7. It wasn't enough to switch the JVM because VisionX had Eclipse JDT under the hood [...]]]></description>
			<content:encoded><![CDATA[<p>We've good news for you. Since our JavaFX UI has reached version 1.0, we thought it might be a good idea to integrate the UI into VisionX. It wasn't that easy because JavaFX needs Java8 and VisionX runs with Java7. It wasn't enough to switch the JVM because VisionX had Eclipse JDT under the hood and the used version wasn't Java8 ready and also some other libraries had problems with Java8.</p>
<p>It was a lot of work to support JavaFX but now it's done. We have Java8 support in VisionX and all referenced projects were updated. We don't have a public version for you right now because the new features need some additional tests. But we're very happy with the current status. Our development version is very stable and all features are still working.</p>
<p>We have a short screencast for you:</p>
<p><center><div class="wp-caption aligncenter nomargin" style="width: 570px"><iframe width="560" height="315" src="https://www.youtube.com/embed/APHJ-8FVA6U" frameborder="0" allowfullscreen></iframe><p class="wp-caption-text">JavaFX with VisionX</p></div><br />
</center></p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/06/29/javafx-ui-and-visionx/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JVx&#039; JavaFX UI 1.0</title>
		<link>https://blog.sibvisions.com/2015/06/22/jvx-javafxui-1-0/</link>
		<comments>https://blog.sibvisions.com/2015/06/22/jvx-javafxui-1-0/#comments</comments>
		<pubDate>Mon, 22 Jun 2015 13:54:50 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[News]]></category>
		<category><![CDATA[Release notes]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=4570</guid>
		<description><![CDATA[We're happy to announce that our JavaFX UI 1.0 was released.
The release contains all planned features and some more. We have the complete MDI implementation, Zoom support for windows and the scene, a custom scene style, custom comboboxes and much more.


























All custom controls are available as separate library, JFXtensions. This library will work without JVx [...]]]></description>
			<content:encoded><![CDATA[<p>We're happy to announce that our <strong>JavaFX UI 1.0</strong> was released.</p>
<p>The release contains all planned features and some more. We have the complete MDI implementation, Zoom support for windows and the scene, a custom scene style, custom comboboxes and much more.</p>
<p><center></p>
<table>
<tr>
<td><div id="attachment_4571" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/mdi.PNG" rel="lightbox[4570]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/mdi-300x232.PNG" alt="MDI control" title="mdi" width="300" height="232" class="size-medium wp-image-4571" /></a><p class="wp-caption-text">MDI control</p></div></td>
<td style="width: 15px;"></td>
<td><div id="attachment_4573" class="wp-caption alignnone nomargin" style="width: 253px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/combostyle.png" rel="lightbox[4570]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/combostyle-243x300.png" alt="Combobox" title="combostyle" width="243" height="300" class="size-medium wp-image-4573" /></a><p class="wp-caption-text">Combobox</p></div></td>
<tr>
<td style="height: 15px;"></td>
</tr>
</tr>
</table>
<table>
<tr>
<td><div id="attachment_4578" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/scene.png" rel="lightbox[4570]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/scene-300x204.png" alt="Styled Scene" title="scene" width="300" height="204" class="size-medium wp-image-4578" /></a><p class="wp-caption-text">Styled Scene</p></div></td>
<td style="width: 15px;"></td>
<td><div id="attachment_4581" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/tableformat.png" rel="lightbox[4570]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/tableformat-300x92.png" alt="Table format (cells)" title="tableformat" width="300" height="92" class="size-medium wp-image-4581" /></a><p class="wp-caption-text">Table format (cells)</p></div></td>
</tr>
</table>
<table>
<tr>
<td><div id="attachment_4583" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/zoom.png" rel="lightbox[4570]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/zoom-300x235.png" alt="Zoom" title="zoom" width="300" height="235" class="size-medium wp-image-4583" /></a><p class="wp-caption-text">Zoom</p></div></td>
<td style="width: 15px;"></td>
<td><div id="attachment_4585" class="wp-caption alignnone nomargin" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/masterdetail.PNG" rel="lightbox[4570]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/masterdetail-300x194.PNG" alt="Master/Detail with Tables and Tree" title="masterdetail" width="300" height="194" class="size-medium wp-image-4585" /></a><p class="wp-caption-text">Master/Detail with Tables and Tree</p></div></td>
</tr>
</table>
<p></center></p>
<p>All custom controls are available as separate library, JFXtensions. This library will work without JVx because it has no dependency to JVx. Simply use our MDI implementation or zoom feature for your own JavaFX application without using JVx.</p>
<p>Jar files are available at <a href="https://sourceforge.net/projects/jvxfx/">SourceForge</a> or <a href="http://search.maven.org/#search%7Cga%7C1%7Cjvxfx">Maven central</a>.</p>
<p><strong>Our next steps?</strong></p>
<p>We'll integrate the UI in our product VisionX to allow Live Preview with JavaFX. The first update release with version number 1.1. will contain smaller bugfixes and improvements based on user feedback.</p>
<p>So, send us your Feedback if you use our library.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/06/22/jvx-javafxui-1-0/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Custom comboboxes with JavaFX</title>
		<link>https://blog.sibvisions.com/2015/06/05/custom-comboboxes/</link>
		<comments>https://blog.sibvisions.com/2015/06/05/custom-comboboxes/#comments</comments>
		<pubDate>Fri, 05 Jun 2015 10:37:55 +0000</pubDate>
		<dc:creator>rjahn</dc:creator>
				<category><![CDATA[Development]]></category>
		<category><![CDATA[JavaFX]]></category>
		<category><![CDATA[JVx]]></category>

		<guid isPermaLink="false">http://blog.sibvisions.com/?p=4460</guid>
		<description><![CDATA[We got great feedback about our first beta release of our JavaFX UI. Many of our ideas were right but our comboxes weren't good enough. We had missing features and some technical problems. One missing feature was: Live search in comboboxes with list of values. Our old implementation of comboboxes was like this:
Our implementation didn't [...]]]></description>
			<content:encoded><![CDATA[<p>We got great feedback about our first beta release of our JavaFX UI. Many of our ideas were right but our comboxes weren't good enough. We had missing features and some technical problems. One missing feature was: Live search in comboboxes with list of values. Our old implementation of comboboxes was like this:</p>
<div id="attachment_3918" class="wp-caption aligncenter" style="width: 310px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/02/javafx_combobox_open.png" rel="lightbox[4460]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/02/javafx_combobox_open-300x153.png" alt="Combo Box" title="javafx_combobox_open" width="300" height="153" class="size-medium wp-image-3918" /></a><p class="wp-caption-text">Combo Box</p></div>
<p>Our implementation didn't support live filtering, e.g. if you typed a key, the list wasn't shortened...</p>
<p>One problem with this feature was JavaFX' focus handling and popups. It was tricky to keep the focus in the right editor and to keep the popup open or to re-open the popup after every keypress. We had a solution but it was too dirty. So we tried to find a better solution. We moved the the editor in the popup, to avoid focus problems. We had crazy effects with two blinking cursors in two different text fields, very strange. </p>
<p>Our current solution is this:</p>
<div id="attachment_4473" class="wp-caption aligncenter" style="width: 300px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/combobox_redesign.png" rel="lightbox[4460]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/combobox_redesign-290x300.png" alt="Filterable combobox" title="combobox_redesign" width="290" height="300" class="size-medium wp-image-4473" /></a><p class="wp-caption-text">Filterable combobox</p></div>
<p>The design is not perfect but we're working on it. The good thing is that we have no problems with focus and filtering is already working. Here's a screenshot of our date editor:</p>
<div id="attachment_4471" class="wp-caption aligncenter" style="width: 246px"><a href="http://blog.sibvisions.com/wp-content/uploads/2015/06/datecombo_redesign.png" rel="lightbox[4460]"><img src="http://blog.sibvisions.com/wp-content/uploads/2015/06/datecombo_redesign-236x300.png" alt="Date editor in combobox" title="datecombo_redesign" width="236" height="300" class="size-medium wp-image-4471" /></a><p class="wp-caption-text">Date editor in combobox</p></div>
<p>Our date editor needs a small redesign but it's working. The optimization was planned for <a href="https://oss.sibvisions.com/index.php?do=details&#038;task_id=1393&#038;project=11">release 1.1</a></p>
<p>If you're interested in our current state, check the <a href="http://sourceforge.net/p/jvxfx/code/HEAD/tree/">source code</a>. We're looking forward to your feedback!</p>
<p>Our code is open source and we still have a separete lib (.ext) for all custom FX controls. The UI implementation for JVx is based on this library. So we have JVx independent JavaFX extensions and our JVx UI implementation.</p>
]]></content:encoded>
			<wfw:commentRss>https://blog.sibvisions.com/2015/06/05/custom-comboboxes/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
