Explicamos cómo desarrollar una aplicación Java que utiliza GUI (entorno gráfico). Mostraremos cómo añadir una ventana (formulario) a nuestra aplicación, con componentes visuales (cuadros de texto, botones, etc.). Usaremos el IDE IntelliJ IDEA y la herramienta de diseño visual Scene Builder. Usaremos el tipo de aplicación JavaFX, sucesor de Swing para entorno gráfico en Java. Probaremos la aplicación resultante en diversos sistemas operativos: Windows, Linux y MAC OS.
- ¿Qué es JavaFX?.
- Requisitos para desarrollar una aplicación JavaFX con GUI entorno gráfico en Java con IntelliJ y SceneBuilder.
- Crear proyecto JavaFX y configurar IntelliJ para que use Scene Builder integrado.
- Diseñar un formulario (ventana) de prueba con IntelliJ y Scene Builder generando fichero .fxml.
- Programar los eventos de los componentes visuales (Button).
- Clase principal Main, iniciar escena JavaFX al arrancar aplicación.
- Compilando y probando aplicación con entorno visual GUI en IntelliJ IDEA con JavaFX.
- Generar fichero ejecutable JAR de aplicación gráfica JavaFX en IntelliJ IDEA.
- Probando aplicación JavaFX con entorno gráfico en equipo MAC OS.
- Descarga del código fuente Java de la aplicación JavaFX de ejemplo.
- Nivel de seguridad en Java para ejecutar JNLP.
- Probando aplicación JavaFX con entorno gráfico en equipo Windows.
- Probando aplicación JavaFX con entorno gráfico en equipo Linux Ubuntu 20.
- Algunos errores y su posible solución.
¿Qué es JavaFX?
JavaFX es una familia de productos y tecnologías de Oracle, para la creación de aplicaciones web (RIA Rich Internet Applications). Se trata de aplicaciones web que tienen las características y capacidades de las aplicaciones de escritorio, incluyendo aplicaciones multimedia interactivas. Las tecnologías incluidas bajo la denominación JavaFX son JavaFX Script y JavaFX Mobile.
Las aplicaciones JavaFX pueden ser ejecutadas en una amplia variedad de dispositivos. En su versión actual permite crear aplicaciones de escritorio (para Windows, Linux, MAC OS), para smartphones, para Web, para televisores smart tv, consolas de videojuegos, reproductores Blu-ray, etc..
JavaFX es compilado a código Java, por lo que las aplicaciones JavaFX pueden ser ejecutadas en equipos con la máquina virtual de Java instalada (JRE), o teléfonos móviles que permitan Java ME.
Requisitos para desarrollar una aplicación JavaFX con GUI entorno gráfico en Java con IntelliJ y SceneBuilder
En primer lugar necesitaremos tener instalado en el quipo Java JDK en una versión igual o superior a la 8. Si no lo tenemos instalado lo descargaremos de la web oficial de Oracle, para el sistema operativo que estemos utilizando. En nuestro caso instalaremos el fichero jdk-8u271-windows-x64.exe para Windows x64. La instalación es bastante sencilla, con un asistente de instalación al que únicamente hay que darle a «Siguiente».
Para el diseño gráfico de los formularios (ventanas) usaremos SceneBuilder. En versiones anteriores de SceneBuilder y de IntelliJ IDEA había que instalar SceneBuilder, descargándolo de la web oficial e instalándolo en el equipo. Posteriormente en IntelliJ IDEA había que indicar dónde estaba el ejecutable de SceneBuilder:
Pero en versiones actuales de IntelliJ IDEA 2020.2 y de JavaFX Scene Builder 11.0.0 ya no es necesario instalar SceneBuilder, como veremos a continuación. Directamente desde el IDE de IntelliJ IDEA nos dará la opción de instalar el plugin de SceneBuilder que se integrará perfectamente con el IDE. Esto lo veremos a continuación.
Por último, necesitaremos un IDE de desarrollo Java, en nuestro caso usaremos IntelliJ IDEA 2020.2, pero lo que explicaremos es muy similar para otros entornos como NetBeans o Eclipse.
Crear proyecto JavaFX y configurar IntelliJ para que use Scene Builder integrado
Abriremos IntelliJ IDEA para crear nuestro primer programa Java con entorno gráfico JavaFX. Pulsaremos en el menú «File» – «New» – «Project» y elegiremos «Java FX». En la parte derecha podemos elegir la versión de SDK que usaremos y tendremos marcado «JavaFX Application». Pulsaremos «Next»:
Introduciremos el nombre para el proyecto, por ejemplo «Primera_Aplicacion_JavaFX» y la ubicación:
El asistente para crear el proyecto JavaFX habrá creado un fichero de ejemplo llamado sample.fxml, lo abriremos desde «src» – «sample» – «sample.fxml» [1]. En la parte inferior pulsaremos en «Scene Builder» [2] y veremos que IntelliJ IDEA detecta que se trata de un fichero editable con Scene Builder, por lo que nos indicara de instalar el plugin «Scene Builder Kit». Pulsaremos en «Download Scene Builder Kit» [3] para que se instale automáticamente:
Puede que también nos indice que hay que instalar JavaFX, de ser así pulsaremos en «Download JavaFX»:
Si todo es correcto nos mostrará el diseñador gráfico de Scene Builder integrado en IntelliJ. Desde aquí podremos añadir los componentes visuales que queramos para nuestra ventana gráfica, como explicaremos a continuación.
Diseñar un formulario (ventana) de prueba con IntelliJ y Scene Builder generando fichero .fxml
Procederemos ahora a crear un formulario de ejemplo en nuestra aplicación. Como hemos indicado anteriormente abriremos el fichero sample.fxml (por supuesto podemos crear los que queramos) y pulsaremos en «Scene Builder» en la parte inferior. Siempre tendremos la opción de ver el código XML del fichero (pulsando en «Text») o bien el modo de diseñador gráfico (pulsando en Scene Builder).
Añadiremos los siguientes elementos:
- Un contenedor, un Pane.
- Dentro del contenedor anterior, añadiremos:
- Dos Label y dos TextField, para solicitar al usuario el nombre y los apellidos.
- Tres Button para enviar los datos introducidos, limpiar los datos y salir del programa.
Todo ello se puede hacer de forma gráfica con Scene Builder:
Nombraremos los TextField y los Button, para luego poder usarlos y hacer referencia a ellos. Para nombrarlos pulsamos en el primer TextField, referente al Nombre y desplegaremos en la derecha la pestaña «Code». En fx:id introduciremos un nombre para el componente, por ejemplo txtNombre:
Repetiremos el proceso para el campo TextField de los apellidos, nombrándolos txtApellidos y para los Button, nombrándolos btLimpiar, btEnviar, btSalir.
Existen numerosas propiedades para cada control (componente) que podemos establecer tanto en el modo gráfico de Scene Builder como editando directamente el fichero .fxml que se genera. Cada componente tendrá sus propiedades, por ejemplo, los TextField: Promp Text, Text, Font, Editable, Alignement, Disable, Opacity, Node Orientation, Visible, Focus Traversable, Cache Shape, Center Shape, Scale Shape, Opaque Insets, Cursor, Effect, Accesible Text, Style, Stylesheets, id, Blend Mode, … y muchas más.
Una vez añadidos los componentes visuales y sus nombres identificativos podremos establecer los eventos de cada uno que queramos programar. Por ejemplo, los eventos clic de los tres botones, para asignar el código Java que ejecutará cada botón. Esto también podemos establecerlo desde Scene Builder, al menos el nombre de cada evento que irá asociado a cada control/componente. Para ello pulsaremos en el primer botón, el botón «Limpiar» [1]. En la parte derecha desplegaremos «Code» [2] y en «On Action» escribiremos un nombre para el evento click, por ejemplo «btLimpiarClick» [3]:
Repetiremos el proceso para el botón «Enviar» (btEnviarClick) y el botón «Salir» (btSalirClick).
Al igual que hemos comentado que existen multitud de propiedades para un componente (control), también existen multitud de eventos, cada componente tendrá los suyos, por ejemplo los Button: On Action, ON Drag Detected, On Drag Done, On Drag Dropped, on Drag Entered, On Drag Exited, On Drag Over, On Mouse Drag Entered, On Mouse Drag Exited, On Mouse Drag Over, On Mouse Drag Released, On Input Method Text Changed, On Key Pressed, On Mouse Clicked, On Mouse Dragged, On Scroll, On Rotate… y muchos más.
Una vez añadidos los componentes, establecidas sus propiedades y añadido el nombre de los eventos que queramos programar podemos ver el resultado en el fichero sample.fxml, pulsando en «Text» en la parte inferior:
Desde aquí también podemos modificar el formulario (ventana), aunque resultará mucho más complicado y hemos de tener conocimientos de XML y de composición de escenas para JavaFX. El fichero FXML resultante:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 |
<?xml version="1.0" encoding="UTF-8"?> <?import javafx.scene.control.*?> <?import javafx.scene.layout.*?> <GridPane alignment="center" hgap="10" vgap="10" xmlns="http://javafx.com/javafx/11.0.1" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller"> <columnConstraints> <ColumnConstraints /> </columnConstraints> <rowConstraints> <RowConstraints /> </rowConstraints> <children> <Pane prefHeight="200.0" prefWidth="200.0"> <children> <Label layoutX="14.0" layoutY="14.0" text="Nombre" /> <TextField fx:id="txtNombre" layoutX="14.0" layoutY="31.0" /> <Label layoutX="14.0" layoutY="68.0" text="Apellidos" /> <TextField fx:id="txtApellidos" layoutX="14.0" layoutY="88.0" /> <Button fx:id="btEnviar" layoutX="115.0" layoutY="133.0" mnemonicParsing="false" onAction="#btEnviarClick" text="Enviar" /> <Button fx:id="btLimpiar" layoutX="13.0" layoutY="133.0" mnemonicParsing="false" onAction="#btLimpiarClick" text="Limpiar" /> <Button fx:id="btSalir" layoutX="11.0" layoutY="174.0" mnemonicParsing="false" onAction="#btSalirClick" prefHeight="25.0" prefWidth="155.0" text="Salir" /> </children> </Pane> </children> </GridPane> |
A continuación mostraremos cómo añadir código Java a cada evento.
Programar los eventos de los componentes visuales (Button)
Una vez que hemos añadido los componentes visuales, sus ID y sus eventos, es hora de programar lo que queramos que haga cada uno de ellos. En nuestro ejemplo, mostraremos una ventana para que el usuario introduzca el nombre y los apellidos. Una vez introducidos, cuando pulse en el botón «Enviar», mostrará los datos en un mensaje. Si pulsa en «Limpiar» borrará los datos introducidos y si pulsa el botón «Salir» cerrará la aplicación.
Abriremos el fichero que el asistente de IntelliJ ha creado, Controller.java, y añadiremos el siguiente código (está comentada cada línea):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 |
package sample; import javafx.event.ActionEvent; import javafx.fxml.FXML; import javafx.scene.control.Alert; import javafx.scene.control.ButtonType; import javafx.scene.control.TextField; import java.util.Optional; public class Controller { @FXML private TextField txtNombre; //Campo "Nombre" del formulario @FXML private TextField txtApellidos; //Campo "Apellidos" del formulario //Evento click en botón "Enviar" //Obtenemos los datos de los Textfield y los mostramos en un mensaje public void btEnviarClick(ActionEvent actionEvent) { //Obtenemos el nombre y apellidos introducidos por //el usuario en los campos TextField de la ventana gráfica String nombre = txtNombre.getText(); String apellidos = txtApellidos.getText(); //Mostramos el nombre introducido en la consola (solo para depuración) System.out.println("Nombre: [" + nombre + "]"); //Mostramos los apellidos introducidos en la consola (solo para depuración) System.out.println("Apellidos: " + apellidos + "]"); //Si el usuario ha introducido nombre y apellidos los mostramos en un mensaje //Si falta algún dato le mostramos un mensaje indicándolo Alert alert; if (nombre.isEmpty() || apellidos.isEmpty()) { alert = new Alert(Alert.AlertType.WARNING); alert.setTitle("Faltan datos..."); alert.setHeaderText("Faltan datos por introducir en el formulario."); alert.setContentText("Debe introducir el nombre y los apellidos."); txtNombre.requestFocus(); } else { alert = new Alert(Alert.AlertType.INFORMATION); alert.setTitle("Datos introducidos en el formulario..."); alert.setHeaderText("Ha introducido correctamente los " + "datos en el formulario. Se muestran a continuación."); alert.setContentText("Nombre: " + nombre + System.lineSeparator() + "Apellidos: " + apellidos); } alert.showAndWait(); } //Evento click en botón "Limpiar" //Vaciaremos los valores introducidos en los TextField public void btLimpiarClick(ActionEvent actionEvent) { txtApellidos.setText(""); txtNombre.setText(""); txtNombre.requestFocus(); } //Evento click en botón "Salir" //Saldremos de la aplicación solicitando confirmación public void btSalirClick(ActionEvent actionEvent) { //Mostramos mensaje de confirmación para cerrar la aplicación Alert alert = new Alert(Alert.AlertType.CONFIRMATION); alert.setTitle("Cerrar aplicación..."); alert.setHeaderText(null); alert.setContentText("¿Desea cerrar la aplicación?"); Optional<ButtonType> result = alert.showAndWait(); //Si se ha pulsado el botón "Aceptar" if (result.get() == ButtonType.OK){ System.exit(0); } else { //Si se ha pulsado el botón "Cancelar" enfocamos en el TextField Nombre txtNombre.requestFocus(); } } } |
En el código anterior hemos añadido a cada evento Click de cada botón su código correspondiente. En algunos casos, como se indica, se interactúa con los componentes visuales TextField, por ejemplo para obtener su contenido, para eliminarlo, o para cambiar el foco a alguno de ellos.
Clase principal Main, iniciar escena JavaFX al arrancar aplicación
Para iniciar el formulario que hemos diseñado, añadiremos el siguiente código Java en la clase Main de nuestra aplicación (Main.java):
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 |
package sample; import javafx.application.Application; import javafx.fxml.FXMLLoader; import javafx.scene.Parent; import javafx.scene.Scene; //import javafx.scene.image.Image; import javafx.stage.Stage; public class Main extends Application { @Override public void start(Stage primaryStage) throws Exception { //Cargamos la escena (el formulario/ventana) Parent root = FXMLLoader.load(getClass().getResource("sample.fxml")); //Establecemos el título de la ventana primaryStage.setTitle("ProyectoA - Mi primera aplicación JavaFX"); //Icono para el formulario //primaryStage.getIcons().add(new Image("proyectoa_logotipo_corto_letra.png")); //Establecemos el ancho y el alto primaryStage.setScene(new Scene(root, 400, 200)); //Mostramos la ventana primaryStage.show(); } public static void main(String[] args) { launch(args); } } |
Compilando y probando aplicación con entorno visual GUI en IntelliJ IDEA con JavaFX
Compilaremos la aplicación y probaremos su funcionamiento. Para ello pulsaremos en el menú «Run» – «Run ‘Main'». En el caso en que no aparezca la opción «Run Main» deberemos pulsar en «Run…» y establecer la clase principal de la aplicación:
Si todo es correcto, se abrirá la ventana gráfica de nuestra aplicación:
Ahora podremos probar a introducir algún dato y pulsar en Enviar:
Vemos que la aplicación nos muestra en un mensaje el contenido de los campos Nombre y Apellidos introducidos por el usuario. Si pulsamos el botón Limpiar los campos se vaciarán y el foco pasará al campo «Nombre»:
Y si pulsamos en «Salir» nos solicitará confirmación para cerrar la aplicación:
Un ejemplo sencillo pero funcional. A continuación generaremos el JAR y lo probaremos en distintos sistemas operativos.
Generar fichero ejecutable JAR de aplicación gráfica JavaFX en IntelliJ IDEA
Para generar el fichero JAR «ejecutable» de nuestra aplicación JavaFX con entorno gráfico pulsaremos en «File» – «Project Structure»:
Seleccionaremos «Artifacts» [1] en «Project Settings», pulsaremos el botón «Add» [2], seleccionaremos «JavaFX Application» [3] y «From module ‘PrimeraAplicacion_JavaFX'» [4]:
Pulsaremos en «Create Manifest…»:
Seleccionaremos la carpeta donde se creará el archivo de manifiesto, por defecto en la del proyecto:
Estableceremos el nombre de la clase principal en «Main Class», en nuestro caso: sample.Main (dado que estamos usando el package «sample»):
En la solapa «Java FX» podremos añadir todos los datos de la aplicación:
- Application class: clase principal de la aplicación, en nuestr ocaso «sample.Main».
- Title: título de la aplicación, por ejemplo «ProyectoA – Primera aplicación JavaFX».
- Vendor: fabricante, desarrollador, por ejemplo «ProyectoA».
- Description, version, width y height, parameters…
- Application icon: icono de la aplicación para Windows (ico), Linux (png) y MAC OS (icns):
- También podremos establecer el certificado de seguridad para que la aplicación pueda ejecutarse en entornos con nivel alto de seguridad Java.
Una vez establecidos todos los datos que consideremos pulsaremos en «OK» en la ventana anterior. Y estaremos preparados para generar el fichero JAR «ejecutable» de nuestra aplicación. Para ello pulsaremos en el menú «Build» – «Build Artifacts…»:
Y en «Primera_Aplicacion_JavaFX» – «Build»:
Si todo es correcto, al general el JAR nos mostrará:
Executing pre-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Running ‘before’ tasks
Checking sources
Building artifact ‘Primera_Aplicacion_JavaFX’…
Deleting outdated files…
Building artifact ‘Primera_Aplicacion_JavaFX’: copying files…
Building archives…
Building …/alonso/IdeaProjects/Primera_Aplicacion_JavaFX/out/artifacts/Primera_Aplicacion_JavaFX/Primera_Aplicacion_JavaFX.jar…
Copying archives…
Running post-processing tasks for ‘Primera_Aplicacion_JavaFX’ artifact…
Running ‘after’ tasks
Finished, saving caches…
Executing post-compile tasks…
Loading Ant Configuration…
Running Ant Tasks…
Synchronizing output directories…
En la carpeta /Primera_Aplicacion_JavaFX/out/artifacts/Primera_Aplicacion_JavaFX podremos comprobar que ha generado:
- Primera_Aplicacion_JavaFX.html: web de ejemplo que contiene un enlace a la ejecución del fichero JNLP con Java Web Start para ejecutar el JAR.
- Primera_Aplicacion_JavaFX.jar: JAR que contiene el fichero de manifiesto y los .class de la aplicación.
- Primera_Aplicacion_JavaFX.jnlp: fichero JNLP que ejecuta el fichero JAR con Java Web Start.
Descarga del código fuente Java de la aplicación JavaFX de ejemplo
A continuación os dejamos el enlace para la descarga del proyecto completo de ejemplo con JavaFX, usando IntelliJ IDEA:
Nivel de seguridad en Java para ejecutar JNLP
Si intentamos ejecutar directamente el JNLP, que en realidad es como un acceso directo para ejecutar el JAR con Java Web Start, puede que funcione o puede que muestre este mensaje, indicando que el nivel de seguridad en la configuración de Java impide la ejecución de aplicaciones locales:
En este caso puede que tengamos que agregar una excepción en la configuración de la seguridad de Java. En las últimas versiones ya no permite el nivel Medio ni bajo, solo Alto o Muy alto. Por lo tanto agregaremos la excepción correspondiente pulsando en «Editar lista de sitios…»:
Introduciremos toda la URL de la ubicación del JAR y JNLP, en nuestro caso:
file:///C:/Users/alonso/IdeaProjects/Primera_Aplicacion_JavaFX/out/artifacts/Primera_Aplicacion_JavaFX/
Nos advertirá de que es una ubicación local file://, pulsaremos en «Continuar»:
Si intentamos ejecutar ahora el JNLP nos mostrará el siguiente aviso y nos ejará ejecutarlo pulsando en «Ejecutar»:
Probando aplicación JavaFX con entorno gráfico en equipo Windows
Como siempre recordamos en la ejecución de aplicaciones Java, tendremos que disponer de una versión igual o superior de Java a la usada para la compilación. En nuestro caso, para probar la aplicación en un equipo con Windows Server 2012 y otro con Windows 10, solo hemos tenido que instalar jre-8u271-windows-x64.exe, descargado desde la web oficial de Java.
Recomendamos ejecutar la aplicación desde la línea de comandos, aunque sea una aplicación visual, dado que si produce algún error al ejecutarse, desde la línea de comandos nos lo mostrará. En cambio, si hacemos doble click sobre el JAR o el JNLP puede que no nos muestre el error.
Para ejecutar la aplicación abrimos una ventana de MS-DOS (línea de comandos o cmd.exe). Comprobaremos que Java está instalado y agregada a la variable de entorno PATH, para comprobarlo será suficiente con ejecutar el comando:
java -version
Que debe devolvernos la versión de Java instalada, en nuestro caso 1.8.0-271.
Accedemos a la carpeta donde se encuentre el JAR (es el único fichero necesario para la ejecución de la aplicación):
cd ProyectoA_JavaFX_W2012
Y la ejecutaremos con el comando:
java -jar Primera_Aplicacion_JavaFX.jar
Si todo es correcto se ejecutará y mostrará la ventana con los componentes visuales:
Además, como vemos en la imagen anterior, en la consola también muestra el texto introducido en los componentes visuales, como hemos indicado en el código Java para depuración.
En el caso de Java JRE 1.8.0-271 vemos que incluyen JavaFX, de lo contrario no habría funcionado la aplicación.
Probando aplicación JavaFX con entorno gráfico en equipo Linux Ubuntu 20
Para la prueba usaremos un equipo con Linux Ubuntu 20.04.01. Abriremos una ventana de Terminal en el equipo Linux, para ello pulsaremos en el botón «Mostrar aplicaciones».
Escribiremos «Terminal» en el buscador y pulsaremos en «Terminal»:
Comprobaremos si tenemos Java con el comando:
java -version
Nos mostrará que no existe el comando «java» y nos dará la opción de instalar Java con varios comandos.
Antes de continuar, hay que destacar que en Linux se suele usar OpenJDK o bien JRE, y en las últimas versiones no incluyen JavaFX, dado que se monta por separado con OpenJFX. Por lo tanto, aunque hemos instalado JRE con el comando
sudo apt install default-jre
Una vez instalado Java JRE, volveremos a escribir el comando:
java -version
que ahora sí nos devolverá la versión de Java:
openjdk version 11.0.9 2020-10-20
Pero la aplicación JAR no funcionará si intentamos ejecutarla. Accedemos a la carpeta donde tengamos el JAR:
cd /home/App_JavaFX_Ubuntu
y tratamos de ejecutarlo con el comando:
java -jar Primera_Aplicacion_JavaFX.jar
Vemos que muestra un error poco descriptivo:
Error: no se ha encontrado o cargado la clase principal sample.Main
Causado por: java.lang.NoClassDefFountError: javafx/application/Application
Incluso aunque instalemos JDK 8 con el comando:
sudo apt install default-jdk
Y lo establezcamos como la carjeta Java por defecto para usar con:
sudo update-alternatives –config java
Introduciendo el número correspondiente a la línea de la versión de Java que queramos usar:
Tampoco ha funcionado la aplicación JAR JavaFX.
Incluso instalando JOpenFX (Java Open FX) con el comando:
sudo apt-get install openjfx-source
Tampoco ha funcionado.
Para conseguir que nuestra aplicación JAR JavaFX se ejecute en Ubuntu 20 hemos ejecutado los siguientes comandos para usar Java de Bell Soft:
wget -q -O – https://download.bell-sw.com/pki/GPG-KEY-bellsoft | sudo apt-key add –
echo «deb [arch=amd64] https://apt.bell-sw.com/ stable main» | sudo tee /etc/apt/sources.list.d/bellsoft.list
sudo apt-get update
sudo apt-get install bellsoft-java11-full
Y para establecer esta versión de Java, que sí incluye JavaFX, ejecutaremos:
sudo update-alternatives –config java
Introduciendo un 2, en nuestro caso, para seleccionar /usr/lib/jvm/bellsoft-java11-full-amd64/bin/java:
Ahora sí que funcionará perfectamente nuestro JAR con JavaFX. Para ejecutarlo accederemos a la carpeta donde tengamos el JAR:
cd /home/App_JavaFX_Ubuntu
y lo ejecutaremos con el comando:
java -jar Primera_Aplicacion_JavaFX.jar
Se iniciará la aplicación y mostrará la ventana y sus controles visuales, exactamente igual que en Windows:
Incluso, una vez configurado Java, desde el modo gráfico, estableciendo el JAR como fichero ejecutable:
Podremos hacer doble click sobre él, la primera vez puede que tengamos que elegir «Abrir con OpenJDK Java 11 Runtime»:
Y se abrirá también nuestro formulario con los componentes visuales:
Probando aplicación JavaFX con entorno gráfico en equipo MAC OS
—
Algunos errores y su posible solución
- Si intentamos ejecutar la aplicación JAR con una versión de Java inferior a la soportada nos mostrará este error:
C:\WXP>java -jar Primera_Aplicacion_JavaFX.jar
Exception in thread «main» java.lang.UnsupportedClassVersionError: sample/Main :
Unsupported major.minor version 52.0
at java.lang.ClassLoader.defineClass1(Native Method)
at java.lang.ClassLoader.defineClassCond(Unknown Source)
at java.lang.ClassLoader.defineClass(Unknown Source)
at java.security.SecureClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.defineClass(Unknown Source)
at java.net.URLClassLoader.access$000(Unknown Source)
at java.net.URLClassLoader$1.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at java.net.URLClassLoader.findClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
at sun.misc.Launcher$AppClassLoader.loadClass(Unknown Source)
at java.lang.ClassLoader.loadClass(Unknown Source)
Could not find the main class: sample.Main. Program will exit.
C:\WXP>java -version
java version «1.6.0_29»
Java(TM) SE Runtime Environment (build 1.6.0_29-b11)
Java HotSpot(TM) Client VM (build 20.4-b02, mixed mode, sharing)
Para solucionarlo solo tendremos que instalar la versión apropiada de Java (JRE) y debe incluir JavaFX.
- En equipos Linux y Windows que tengan Java JRE o Java SDK pero no Java FX, al ejecutar el JAR mostrará el error:
Error: no se ha encontrado o cargado la clase principal sample.Main
Causado por: java.lang.NoClassDefFountError: javafx/application/Application
En este caso el problema se soluciona como hemos indicando en la ejecución de la aplicación en Linux, instando un Java que incluya JavaFX, por ejemplo Liberica OpenJDK de BellSoft.