¿Cómo crear un archivo FXML para un nuevo componente ya creado en Java que agregarlo al generador de escenas?

Soy nuevo en javaFX. Creé un cuadro de búsqueda personalizado (extiende TextField) en java, verifica la imagen:

enter image description here

Lo probé con una clase de prueba y está funcionando.

Quiero saber ahora si es posible crear su archivo FXML que agregar este componente al generador de escenas. cómo hacerlo ? Gracias por adelantado.

Cómo importar un componente de un JAR en SceneBuilder

Puede poner su componente en un Jar e importarlo a SceneBuilder. No necesita crear un archivo FXML para que su componente lo agregue al Panel de la Biblioteca de SceneBuilder.

Consulte la sección Agregar componentes personalizados a la biblioteca de la guía del usuario de JavaFX.

Para importar componentes personalizados de GUI desde un archivo JAR o FXML:

  1. Seleccione Importar archivo JAR / FXML desde el menú del panel Biblioteca, o arrastre el archivo JAR o FXML directamente desde el administrador de archivos nativo de su sistema (Explorer o Finder) y suéltelo en el panel Biblioteca.

  2. En la ventana de diálogo Abrir, vaya a la ubicación del archivo JAR o FXML que desea importar. Se muestra el cuadro de diálogo Importar, similar a lo que se muestra en la Figura 8-4 . Los contenidos del archivo JAR se inspeccionan y todas las clases de Java que se determinan como componentes personalizados adecuados se muestran en la ventana de diálogo. Los contenidos del archivo FXML se analizan para asegurarse de que el componente que se agrega sea válido y autónomo.

  3. Desde la ventana de diálogo Importar, seleccione o anule la selección de elementos de la lista de elementos que puede importar.

  4. Haga clic en Importar componentes. Los elementos importados se agregan a la sección Personalizado del panel Biblioteca. Se pueden usar de inmediato y persisten en la Biblioteca incluso después de reiniciar Scene Builder

Tenga en cuenta que SceneBuilder también admite la importación de componentes basados ​​en FXML en lugar de solo componentes de código directo. Esta respuesta solo trata la importación de componentes solo de código que no contienen FXML.

Ejemplo de uso de componentes importados

Aquí hay un componente de campo de búsqueda personalizado que importé a SceneBuilder usando el método descrito anteriormente.

muestra de búsqueda

El panel de búsqueda superior está en el panel de diseño del Constructor de Escenas, el panel de búsqueda inferior es el resultado del uso de la función de vista previa del Constructor de Escenas y la búsqueda de la felicidad.

Ejemplo de código generado SceneBuilder

El archivo fxml generado por SceneBuilder basado en el diseño se incluye aquí. Tenga en cuenta que esta fue solo una escena de prueba que creé con SceneBuilder para probar el componente ya importado, no era parte del proceso de importación de componentes en sí.

                

Código de componente de muestra (importable)

El código para el cuadro de búsqueda que se importó es:

 package org.jewelsea; import javafx.geometry.Insets; import javafx.scene.control.Button; import javafx.scene.control.Label; import javafx.scene.control.TextField; import javafx.scene.layout.HBox; import javafx.scene.layout.StackPane; import javafx.scene.layout.VBox; public class SearchField extends StackPane { private final TextField textField; private final Button searchButton; private final Label searchResults; public SearchField() { textField = new TextField(); textField.setPromptText( "Search Text" ); searchButton = new Button("Search"); searchResults = new Label(); VBox layout = new VBox( 20, new HBox( 10, textField, searchButton ), searchResults ); layout.setPadding(new Insets(10)); searchButton.setOnAction(event -> searchResults.setText( "Search result for " + textField.getText() ) ); getChildren().setAll( layout ); } } 

Requisitos previos del componente

Para que el proceso funcione, hay algunas cosas que debe asegurarse:

  1. Su clase de componente se extiende Nodo.
  2. Su clase de componente tiene un constructor sin argumentos.
  3. Su clase de componente y ningún constructor de argumentos son públicos.
  4. Su clase de componente está en un paquete (p. Ej., Org.jewelsea); no puede tener ningún conjunto de paquetes.
  5. Su clase de componente se empaqueta en un archivo JAR que se ha importado a SceneBuilder como se describe arriba.

Solución de problemas

Si tiene problemas para importar el JAR, después de intentar una importación JAR, puede usar la función de análisis JAR documentada a continuación para ayudar a solucionar problemas (lo que podría ayudar o podría proporcionar información críptica para confundirlo más).

análisis de archivos jar