我已经在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(); } }
new 使用FXML时,永远不要实例化控制器,因为实例化控制器的工作是由FXMLLoader完成的。在实例化控制器时,它还会创建FXML中存在的节点的实例,并将其注入到控制器中。
new
如果未从FMXLLoader获取控制器实例,则该控制器内所有用eill注释的节点均为@FXML空。因此,您必须始终将Controller从fxml中删除。
@FXML
在您的情况下,您应该使用
bpic = fxmlLoader.getController();
代替
bpic =新的BottomPanelIncomingController();
更新资料
单击按钮更改FXML
让我们考虑以下方法在按钮单击时被调用
@FXML public void callAccepted(ActionEvent event){ System.out.println("From controller"); nrb.loadSecondFxml(); }
您可以加载FXML并将其设置在场景上,然后设置为 JFXPanel
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 并应用您的逻辑。