Java 在fxml文件之间切换
我已经在swing组件中使用jfxPanel创建了一个应用程序。我面临的问题是无法更改fxml文件。单击fxml的一个按钮时,我想处理那个fxml并在那个里加载另一个fxml文件。 这就是我到现在为止所做的Java 在fxml文件之间切换,java,swing,javafx,fxml,fxmlloader,Java,Swing,Javafx,Fxml,Fxmlloader,我已经在swing组件中使用jfxPanel创建了一个应用程序。我面临的问题是无法更改fxml文件。单击fxml的一个按钮时,我想处理那个fxml并在那个里加载另一个fxml文件。 这就是我到现在为止所做的 public class NonResponsiveButtons extends JFrame { NonResponsiveButtons nrb; BottomPanelIncomingController bpic; JPanel panel; JP
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 EI注释的节点都将为空。因此,必须始终将控制器从fxml中取出 在您的情况下,您应该使用 bpic=fxmlLoader.getController 而不是 bpic=新的控制器 更新 单击按钮即可更改FXML的步骤
让我们考虑以下方法:点击按钮< /P>
@FXML
public void callAccepted(ActionEvent event){
System.out.println("From controller");
nrb.loadSecondFxml();
}
您可以加载FXML并在场景中进行设置,然后将其设置到JFXPanel
注:我不确定你在这里试图实现什么,把这个当作一个例子来加载FXML点击按钮并应用逻辑。问题是什么?您是否收到任何错误/异常?空指针异常。当我在SetNonResponsiveButtonsNonResponsiveButtons nrb中输入BottomPanelIncomingController类时。我已经编辑了我的问题,并在问题中添加了BottomPanelIncomingController代码。您必须始终将控制器从fxml中取出。使用bpic=fxmlLoader.getController;代替bpic=新的BottomPanelIncomingController;谢谢你,这很有效。现在我想在单击fxml文件的按钮时重新调整fxml文件的速度。我该怎么做谢谢你它成功了。我假设首先必须删除jfxpanel的当前组件,然后在那里加载另一个fxml文件,但这样做是有效的。最后一个问题,以前的fxml文件对象是否仍然存在或已被释放?因为我们没有手动处理它
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);
}