This website uses cookies for visitor traffic analysis. By using the website, you agree with storing the cookies on your computer.More information

Category: News

VisionX Feature - Export a desktop application

At the end of the "new features" week, we'll introduce another great VisionX feature. It's the export of an application as desktop application.

What does desktop application mean?

VisionX usually creates 3-tier database applications. The GUI is separated from the business logic and decoupled from the database. The GUI usually runs on client machines, the business logic on application servers and the database could be on the same machine as the application server or could be a different server machine in your network. If you use our HTML5 launcher, the GUI and business logic will run on the application server. This means that the application seams to be 2-tier (Client/Server), but no worries the applications are always 3-tier.

A desktop application should/could work without an application server because it's overhead for some use-cases. This means that the desktop application contains the GUI and the business logic. It directly uses/connects to the database and you could say that such an application is a 2-tier Client/Server application. A desktop application needs manuall "installation" and manual updates. If you have small departments and/or don't have a lot of infrastructure/servers, a desktop application might fit perfectly.

VisionX?

All applications, created with VisionX, have an ant build file that makes it possible to create war files and do deployments. It's an easy task, for developers, to create a desktop application from the created files. It's enough to define the classpath that contains all libraries, use the right main class and add important start parameters. The steps are the same as for any other Java application.

But our applications have some additional features like an application help. This help can be created with VisionX and it's an online help based on vaadin. The integration of an online help into a desktop application makes the task a little bit tricky.

VisionX does all necessary steps for you and your desktop application will be ready after some seconds. The application is packed into a zip archive that contains an executable jar file (start via double click), a bat file for windows, a sh script for linux/mac and an exe file for windows. The installation is very easy because every modern OS is able to extract zip archives without additional tools.

New JVx feature - Focus index

The next great feature of JVx is the customizable focus order.

The focus order defines the navigation between components via Tabulator or Enter. If you press Tab in an Editor with index 1, the focus will jump to the component (e.g. an Editor) with the next higher index. If you didn't define an index, the default focus order of Java will be used.

We introduced

setTabIndex(Integer)

in IComponent. This makes it possible to easily configure the focus order. We also have support for this new feature in VisionX. It's really helpful:

Set focus order

Set focus order

The designer shows the focus index and it's possible to set the index via customizer.

Oracle Forms (FMB) to Java conversion

If you're an Oracle Forms user and think about a different technology for your applications, watch following screen cast. It shows how we use VisionX to migrate FMB (windows) to Java, in seconds. Simply watch 90 seconds and it's done :)


JVx Application Stack


Another use-case is the integration of a Java screen, directly in your Oracle Forms application. See our solution in action:


JVx Application Stack


The first video shows our record navigion similar to Oracle Forms and of course, we have a solution for Forms' Enter query mode.

VisionX Update 2.0.121

Great news for all VisionX users!

The current update release 2.0.121 is available for download. Please check your download area.

The release is more than just an update release. It contains all currently available features. We wrote about some of them:

Repeating frames
IDE integration
QR Codes
Features for developers
Ready made solutions

It contains current JVx, ProjX libraries and source code.

If you miss some features after upgrading, please contact our product support because previous versions provided features without valid license. If the features are already licensed, no worries.

We have a product and feature overview for you.

Repeating frames - Oracle Forms related feature

We have a really cool new feature for you. It's comparable to repeating frames of Oracle Forms. It's more or less a free-form table. Every row is a panel with custom components and every row shows the same components but bound to our DataBook.

A short video will demonstrate how it works:


JVx Application Stack


We use the name ComponentTable for the control. It'll be available in one of the next VisionX nightly builds but will be limited to our OracleForms license option.

VisionX RnD news - IDE integration

We want to tell you some fantastic news from our RnD team: The next big step for VisionX will be an IDE integration feature.

Our team is working very hard to reach the goals. The result will be an Eclipse plugin that connects to VisionX and allows bidirectional communication. We won't embedd VisionX in Eclipse because it makes no sense for us, but we'll use the whole power of the IDE.

What will be supported?

  • Event links (Eclipse)

    A click on an event action string will jump to the right method.

    databook.eventValuesChanged().addListener(this, "doValuesChanged");

    The click on doValuesChanged will jump to the method in the work-screen.

  • Call links (Eclipse)

    A click on an action/object call will jump to the right method, in the right life-cycle object.

    getConnection().callAction("getLicenseInformation");

    The click on getLicenseInformation will jump to the method in the life-cycle object.

  • DataBook links (Eclipse)

    A click on the name of a databook will jump to the storage definition, in the life-cycle object.

    RemoteDataBook rdb = new RemoteDataBook();
    rdb.setDataSource(dataSource);
    rdb.setName("users");
    rdb.open();

    The click on users will jump to the DBStorage definition, in the the life-cycle object.

  • Auto completion (Eclipse)

    We'll offer auto completion for table columns, event methods, action/object calls, ...

    databook.getRowDefinition().getColumnDefinition("DESCRIPTION").getDataType().setCellEditor(VisionXUtil.MULTILINE_EDITOR);

    It'll be possible to get a list of all available columns, like DESCRIPTION.

  • Column checks (Eclipse)

    We'll check if all column names are valid and will show compiler warnings/errors.

  • Jump to Eclipse

    It'll be possible, with VisionX, to jump to the source code of e.g. actions, component definitions or databooks in Eclipse. We'll introduce some new Buttons in VisionX, for that feature.

    VisionX E-Plug

    VisionX E-Plug

  • Jump to VisionX

    It'll be possible, with Eclipse, to highlight selected GUI components directly in VisionX.

No worries, we have more features for you!

The IDE integration will be available as optional VisionX module.

VisionX feature - QR code generation

We have a new feature for you!

It's an API to generate QR codes. The API is available in ProjX and you can easily create custom Contact, Phone number, Text, E-Mail and Geo Location QR codes.

We've some new actions for QR code generation in VisionX to easily use the new API.

It's a cool new feature and we've a new example application in our Solution store, but be careful because you need VisionX 2.0.85, or newer, for this feature.

Here's a screenshot from the application:

QR code generation

QR code generation

Create your own QR codes in seconds!

New VisionX feature for developers

This new feature is especially for all Oracle Forms developers :)

It will be possible to configure existing DB storages and create new storages. The feature will be added to the data area of VisionX:

Storage edit button

Storage edit button

The new wizard will show the default SQL statement and it'll be possible to change the statement:

Edit DB storage(s)

Edit DB storage(s)

This new wizard is not useful for end-users because only developers should change SQL statements. Because of that, it won't be available for all VisionX users - it depends on the license.

The new wizard has some additional features like moving a DB storage from screen-level to session level which is like a global storage. You can create DB storages without creating a RemoteDataBook. Such storages will be available as source for drop-downs in the data edit wizard, like Views or Tables.

The new feature-set will make you happy!

Our Live-Ticker implementation - World cup 2014

We got a lot of (positive) feedback for our live ticker in Packung! It's great to see actual results depending on the current score :)

We started our live ticker in 2008 with a simple implementation in Java. The solution simply sniffed results from standard html pages. It was easy to get results because result pages didn't use Ajax. It was harder in 2010 and 2012 because Ajax was heavily used. But we found some pages without Ajax.

What's the problem with Ajax? It's not possible to get the complete html content with one simple http request with Java. You need a "browser" that handles javascript and async calls.

We didn't find a html page with live results this year, which didn't use Ajax or Flash. So we thought about a clever solution because we won't pay for "free content". And of course, our betting game is free and we don't earn money. But what's a clever solution? The task is simple: Grab results from existing live-ticker website (be aware of Ajax) - but how?

The solution is simple: Use a browser :)

But Java doesn't offer a browser control, doesn't it? Yes, JavaFX does!

In 2008 we played around with QT webkit control of QT Jambi (but the project is not active) because it was a nice browser control. The problem was that it didn't work headless and our application server was a linux box without X-Server. This year, we had the same restrictions because our server is a linux box and still no X-Server. We thought that JavaFX could be the right solution for us...

BUT it doesn't work headless enough - not with latest release. It will be better in upcoming releases and/or custom JavaFX builds because there is a Glass windowing component called Monocle. But this was the right challenge for us.

Our current solution runs on Linux, without a real X-Server. It's a JavaFX WebView/WebEngine that reads data from a public live-ticker.

How our solution works?

Install important linux packages:

yum install xorg-x11-server-Xvfb xorg-x11-xauth gcc glib2 glib2-devel libtiff libtiff-devel libjpeg-devel cairo cairo-devel pango pango-devel redhat-lsb

optional if available

yum install redhat-lsb-graphics

Download and install ATK

wget ftp://ftp.muug.mb.ca/mirror/centos/6/os/x86_64/Packages/atk-1.30.0-1.el6.x86_64.rpm
wget ftp://ftp.muug.mb.ca/mirror/centos/6/os/x86_64/Packages/atk-devel-1.30.0-1.el6.x86_64.rpm
rpm -Uvh *.rpm

and GTK+

wget http://ftp.gnome.org/pub/gnome/sources/gtk+/2.18/gtk+-2.18.2.tar.gz
tar -xvf gtk+-2.18.2.tar.gz
cd gtk+-2.18.2
./configure
make
make install

Start Xvfb:

Xvfb :99 &

Start application:

#!/bin/sh
export DISPLAY=:99
export LD_LIBRARY_PATH=/usr/local/lib
./jdk1.8.0_05/bin/java -jar livescore.jar >> liveupdate.log 2>> liveupdate_err.log &

The application itself is trivial. It's a class with main method:

/**
 * Starts the application.
 *
 * @param pArgs the application parameters
 */

public static void main(String[] pArgs)
{
    new Livescore();
}

/**
 * Creates a new instance of <code>Livescore</code> and starts the update procedure.
 */

public Livescore()
{
    super();

    fxPanel = new JFXPanel();
       
    Platform.runLater(new Runnable()
    {
        public void run()
        {
            fxPanel.setScene(new Scene(new BorderPane(), 800, 600));
               
            browser = new SimpleBrowser();
            browser.load();
        }
    });
       
    start();
}

We need the JFXPanel because JavaFX needs a scene, otherwise it'll throw Exceptions. We don't need the instance for other things.

The SimpleBrowser class is similar to this snippet:

/**
 * Loads the configured website.
 */

public void load()
{
    if (view == null)
    {
        view = new WebView();
        engine = view.getEngine();

        engine.load("http://live-ticker.url");
    }
    else
    {
        engine.reload();
    }

    if (thCheck == null)
    {
        thCheck = new Thread(new Runnable()
        {
            public void run()
            {
                try
                {
                    while (Thread.currentThread() == thCheck)
                    {
                        Platform.runLater(new Runnable()
                        {
                            public void run()
                            {
                                checkResults();
                            }
                        });
                       
                        Thread.sleep(10000);
                    }
                }
                catch (InterruptedException ie)
                {
                    //stop
                }
               
                thCheck = null;
            }
        });
        thCheck.start();
    }
}

That's it. We got two "silent" Exceptions

java.lang.NullPointerException
  at sun.reflect.UnsafeFieldAccessorImpl.ensureObj(UnsafeFieldAccessorImpl.java:57)
  at sun.reflect.UnsafeObjectFieldAccessorImpl.get(UnsafeObjectFieldAccessorImpl.java:36)
  at java.lang.reflect.Field.get(Field.java:387)
  at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.getFieldValue(ScrollBarThemeImpl.java:397)
 ...
Exception in thread "JavaFX Application Thread" java.lang.NullPointerException
  at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.thumbPosition(ScrollBarThemeImpl.java:267)
  at com.sun.javafx.webkit.theme.ScrollBarThemeImpl.getThumbPosition(ScrollBarThemeImpl.java:352)
  at com.sun.webkit.Timer.twkFireTimerEvent(Native Method)
  at com.sun.webkit.Timer.fireTimerEvent(Timer.java:66)
  at com.sun.webkit.Timer.notifyTick(Timer.java:47)
  at javafx.scene.web.WebEngine$PulseTimer$2.pulse(WebEngine.java:1154)
  ...

after the application start, because of some scrolling problems, but these Exceptions had no effect (in our solution).

The solution would rock with a real headless JavaFX but it's ok for us.

VisionX store - Test phase!

Our VisionX store is now available for selected customers.
It'll be included in VisionX starting with version 2.0.28 and should work out-of-the-box.

The final UI will look like:

VisionX Solution store

VisionX Solution store

We'll offer free applications, modules and addons but also paid content for customers with a valid license. The first application is our Demo ERP which shows the full power of VisionX because it contains reports, a lot of actions, charts, a tree and will run as desktop, web and native iOS application.

The server-side of the store was developed with standard JVx and the client as well, but the client isn't available without VisionX. It's possible to host your own VisionX store in your own environment, but this feature needs a separate license.

Have fun ;-)