在fxml文件之间切换

我在swing组件中使用jfxPanel创建了一个应用程序。 我面临的问题是我无法更改fxml文件。 当单击fxml的按钮时,我想处理该fxml并在那里加载另一个fxml文件。 这就是我到目前为止所做的

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; } 

}

BottomPanelIncommingController类。 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(); } } 

在使用FXML时,不应该使用new实例化控制器,因为实例化控制器的作业是由FXMLLoader完成的。 在实例化控制器时,它还会创建FXML中存在的节点实例并将它们注入控制器。

如果没有从FMXLLoader获取控制器实例,则控制器内用@FXML注释的所有节点都@FXML空。 因此,您必须始终将控制器从fxml中取出。

在你的情况下,你应该使用

bpic = fxmlLoader.getController();

代替

bpic = new BottomPanelIncomingController();

更新

单击按钮更改FXML

让我们考虑在Button上调用以下方法

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

您可以加载FXML并将其设置在场景上,然后再设置为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); } 

注意:我不确定您要在这里实现什么,请将此视为仅通过单击按钮加载FXML并应用逻辑的示例。