ventanas ventana usar una secundarias pasar example entre desde datos controladores como boton abrir java swing javafx fxml fxmlloader

usar - javafx ventanas secundarias



Cambiar entre archivos fxml (1)

Nunca debe instanciar el controlador con new cuando está utilizando FXML porque el trabajo para instanciar el controlador lo realiza el FXMLLoader. Al crear instancias del controlador, también crea instancias de los nodos que están en el FXML y los inyecta en el controlador.

Si no obtiene la instancia del controlador del FMXLLoader, todos sus nodos dentro del controlador que están anotados con @FXML serán nulos. Por lo tanto, siempre debe sacar el controlador del fxml.

En tu caso, debes usar

bpic = fxmlLoader.getController ();

en lugar de

bpic = new BottomPanelIncomingController ();

Actualizar

Para cambiar el FXML al hacer clic en un botón

Vamos a considerar el siguiente método se llama al hacer clic en el botón

@FXML public void callAccepted(ActionEvent event){ System.out.println("From controller"); nrb.loadSecondFxml(); }

Puede cargar el FXML y configurarlo en una escena y luego en el JFXPanel

public void loadSecondFxml(){ //Load new FXML and assign it to scene FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("newFXML.fxml")); Parent root = (Parent) fxmlLoader.load(); Scene scene = new Scene(root, 600, 65); jfxPanel.setScene(scene); }

Nota: No estoy seguro de lo que está tratando de lograr aquí, considere esto como un ejemplo solo para cargar FXML al hacer clic en un botón y aplicar su lógica.

He creado una aplicación usando jfxPanel dentro del componente swing. El problema que estoy enfrentando es que no puedo cambiar los archivos fxml. Cuando se hace clic en un botón del fxml, quiero deshacerme de ese fxml y cargar otro archivo fxml allí. Esto es lo que hice hasta ahora

public class NonResponsiveButtons extends JFrame { NonResponsiveButtons nrb; BottomPanelIncomingController bpic; JPanel panel; JPanel bPanel; private int applicationWidth_600 = 600; private int applicationHeight_600 = 600; private int upperPanelHeight_535 = 535; private int bottomPanelHeight_65 = (applicationHeight_600-upperPanelHeight_535); public static void main(String[] args) { new NonResponsiveButtons(); } public NonResponsiveButtons(){ final JFXPanel fxPanel = new JFXPanel(); SwingUtilities.invokeLater(new Runnable() { @Override public void run() { // TODO Auto-generated method stub try{ new JFXPanel(); add(getJPanel(), BorderLayout.CENTER); add(getJBottomPanel(), BorderLayout.PAGE_END); bPanel.add(fxPanel, BorderLayout.CENTER); Platform.runLater((new Runnable() { @Override public void run() { // TODO Auto-generated method stub initFX(fxPanel); } })) ; } catch(Exception e){ System.out.println("Error in swing utilities thread :" + e.getMessage()); } } }); this.setSize(applicationWidth_600, applicationHeight_600); setLocationRelativeTo(null); BorderLayout borderLayout = new BorderLayout(); setLayout(borderLayout); setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE); setVisible(true); } private void initFX(JFXPanel jfxPanel) { try { FXMLLoader fxmlLoader = new FXMLLoader(getClass().getResource("fxmlDesign.fxml")); Parent root = (Parent) fxmlLoader.load(); Scene scene = new Scene(root, 600, 65); jfxPanel.setScene(scene); fxmlLoader.getController(); bpic = new BottomPanelIncomingController(); bpic.setNonResoinsiveButtons(this); } catch (IOException exc) { exc.printStackTrace(); System.exit(1); } } public void loadSecondFxml(){ System.out.println("loading second fxml"); } private JPanel getJPanel(){ if(panel == null){ panel = new JPanel(); panel.setSize(applicationWidth_600,upperPanelHeight_535); panel.setBackground(Color.gray); } return panel; } private JPanel getJBottomPanel(){ if(bPanel == null){ bPanel = new JPanel(); bPanel.setSize(applicationWidth_600, bottomPanelHeight_65); bPanel.setBackground(new Color(8, 16, 19)); } return bPanel; }

}

La clase BottomPanelIncommingController. El controlador de fxml

public class BottomPanelIncomingController implements Initializable { NonResponsiveButtons nrb; @Override public void initialize(URL arg0, ResourceBundle arg1) { // TODO Auto-generated method stub System.out.println("HEllo"); } public void setNonResoinsiveButtons(NonResponsiveButtons nrb){ this.nrb = nrb; } @FXML public void callAccepted(ActionEvent event){ System.out.println("From controller"); nrb.loadSecondFxml(); } }