One of the challenges when writing Desktop applications in Java has always been deployment. The write once run code anywhere concept has always been attractive but it has been the running of the code which has traditionally been the stumbling block.
Over the years there have been many solutions developed to overcome these challenges. Initially there was the executable JAR file, a container holding all the code which when a user double clicked on the file would launch the Java code within the container using the Java Virtual Machine (JVM) installed on the users machine. Of course this assumed that the user had a correctly installed JVM which was the correct version, and knew they had to double click the JAR file to run the code.
Then there was the Java Web Start which required the user to be connected to the internet to launch the application, not always an option. It also required the developer to deploy the code to a Java Web Start enabled server.
Then there are Java launchers, tools that allow the developer to package up their code and then use a native executable program to unpack the code, run the JVM and pass the code into the JVM. There is still a requirement to have a suitable JVM installed on the user machine
Beyond that you can get specialist tools such as Ahead Of Time (AOT) compilers or Java aware authoring tools such as InstallShield. For a more comprehensive article around this subject can I recommend the article ‘Convert Java to EXE’ by Dmitry LESKOV which can be found here http://www.excelsior-usa.com/articles/java-to-exe.html.
I like JSmooth because it is simple and intuitive to use however it does not support splash screens in a way I wish to use them for the projects covered here so I am going with Launch4J.