ventana - ¿Cómo crear múltiples controladores javafx con diferentes archivos fxml?
javafx ventanas secundarias (4)
Puede incluir documentos FXML uno dentro de otro, lo que le ayudará a separar la lógica de diseño.
Esto significa que puede tener controladores anidados , uno para cada documento.
Desde la documentación, ahora puede configurar su código para que la lógica se pueda separar y también invocar desde el controlador raíz (si es necesario).
Espero que ayude.
He estado viendo algunos blogs y otras preguntas de stackoverflow, y no veo una respuesta directa a mi pregunta. Estoy creando un cliente javafx gui y quiero que mi barra de menú sea un controlador en un fxml y luego quiero que el área de contenido sean archivos fxml adicionales. La pantalla de inicio de sesión será un fxml, después de la pantalla de inicio de sesión será el contenido principal de la aplicación y estará en un fxml. ¿Cómo voy a hacer esto?
Simplemente no quiero tener todo mi código para mi inicio de sesión, barra de menú y contenido principal en el mismo archivo. Esta es una imagen de lo que estoy trabajando:
Necesitaba una ventana emergente con requisitos similares (más control sobre los nodos y el diseño).
Después de haber seguido las recomendaciones, encontré una solución que podría ser útil.
Primero, creé un segundo documento fxml y un segundo controlador (en NetBeans, Nuevo -> Vaciar FXML ... -> Usar Java Controlador -> Crear Nuevo ...).
Un pequeño desafío fue descubrir cómo construir el escenario en el controlador principal y conectarlo al controlador emergente.
El enlace Pasando los parámetros JavaFX FXML proporciona algunas ideas y técnicas realmente buenas.
El código final tiene este aspecto (espero que pueda ayudar a alguien):
// Anchor Pane from the popup
@FXML
AnchorPane anchorPanePopup;
@FXML
private void soneButtonAction(ActionEvent event) throws IOException {
Stage newStage = new Stage();
AnchorPane anchorPanePopup = (AnchorPane) FXMLLoader.load(getClass().getResource("Popup_FXML.fxml"));
Scene scene = new Scene(anchorPanePopup);
newStage.setScene(scene);
newStage.initModality(Modality.APPLICATION_MODAL);
newStage.setTitle("Dialog Window");
newStage.showAndWait();
}
Use FXML como componentes usando una clase java personalizada como fx: root y como fx: controller de su archivo FXML: http://docs.oracle.com/javafx/2/fxml_get_started/custom_control.htm
Para hacerlo, debe llamar al constructor de su clase java personalizada FXMLLoader que cargará su FXML. La ventaja es cambiar la forma en que FXML carga los componentes.
La forma clásica de instanciar componentes a través de FXMLLoader con controladores anidados es: primero FXML, luego el controlador para cada parte.
Con esta técnica, esto es: primero el controlador, luego FXML para cada componente. Y no cargará FXML en FXML directamente, importará sus clases java personalizadas en el FXML.
Esta es una mejor abstracción (no es necesario saber cómo se implementa un componente cuando los importa en FXML) y ayuda a reutilizar el código, ya que es como implementar un widget personalizado con soporte de FXML. Para hacer que su componente sea reutilizable, asegúrese de que su implementación no tenga un acoplamiento estrecho con otras partes, o use IOC para hacerlo (por ejemplo, con la integración de Spring con JavaFX). De esta forma, podrá importar su componente en cualquier parte de su aplicación (como un widget DateInput) sin preocupaciones y no duplicará el código.
En tu caso tendrás:
public class MenuBox extends VBox {
@FXML
private LoginBox loginBox;
@FXML
private ProfilesBox profilesBox;
public MenuBox() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("menu.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public class LoginBox extends VBox {
public LoginBox() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("login.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
public class ProfilesBox extends VBox {
public ProfilesBox() {
FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("profiles.fxml"));
fxmlLoader.setRoot(this);
fxmlLoader.setController(this);
try {
fxmlLoader.load();
} catch (IOException exception) {
throw new RuntimeException(exception);
}
}
E importará LoginBox y ProfilesBox en menu.fxml que administra el diseño global de su página:
<?import com.foo.bar.LoginBox ?>
<?import com.foo.bar.ProfilesBox ?>
<fx:root type="javafx.scene.layout.VBox"
xmlns:fx="http://javafx.com/fxml">
<!-- Stuff here to declare the menu bar-->
<HBox>
<ProfilesBox fx:id="profilesBox"/>
<LoginBox fx:id="loginBox"/>
</HBox>
</fx:root>
login.fxml y profiles.fxml contienen solo componentes básicos.
package javafxapplication11;
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.FXMLLoader;
import javafx.fxml.Initializable;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.CheckBox;
import javafx.stage.Stage;
public class FXMLDocumentController implements Initializable {
@FXML
private CheckBox c1;
@FXML
private CheckBox c2;
public void clicked1(ActionEvent e) throws IOException {
Parent home_page_parent
=FXMLLoader.load(getClass().getResource("AddDcuFXML.fxml"));
Scene home_page_scene = new Scene(home_page_parent);
Stage app_stage = (Stage) ((Node) e.getSource()).getScene().getWindow();
app_stage.hide(); //optional
app_stage.setScene(home_page_scene);
app_stage.show();
}
public void clicked2(ActionEvent e) throws IOException {
Parent home_page_parent
=FXMLLoader.load(getClass().getResource("ViewDCU.fxml"));
Scene home_page_scene = new Scene(home_page_parent);
Stage app_stage = (Stage) ((Node) e.getSource()).getScene().getWindow();
app_stage.hide(); //optional
app_stage.setScene(home_page_scene);
app_stage.show();
}
public void clicked3(ActionEvent e) throws IOException {
Parent home_page_parent
=FXMLLoader.load(getClass().getResource("ViewDCU.fxml"));
Scene home_page_scene = new Scene(home_page_parent);
Stage app_stage = (Stage) ((Node) e.getSource()).getScene().getWindow();
app_stage.hide(); //optional
app_stage.setScene(home_page_scene);
app_stage.show();
}
@Override
public void initialize(URL arg0, ResourceBundle arg1) {
// TODO Auto-generated method stub
}
}