Javafx 2 如何在运行时通过单击按钮更改子fxml gui部件

Javafx 2 如何在运行时通过单击按钮更改子fxml gui部件,javafx-2,fxml,Javafx 2,Fxml,我正在尝试为一个大型复杂的gui构建一个框架,所以我的想法是在JavaFX2.1中使用类似mvc的风格,这样每个组件都有一个fxml文件,如果需要,还有css、控制器和模型。我试图弄清楚如何更改子场景(运行时的子fxml)。有人知道怎么做吗?我有点困在这上面了。可以添加MainViewController吗?场景:用户单击任务栏中的按钮,包含的content1.fxml将替换为content2.fxml 这里是基本代码 MainApp.java Loads the MainView.fxml

我正在尝试为一个大型复杂的gui构建一个框架,所以我的想法是在JavaFX2.1中使用类似mvc的风格,这样每个组件都有一个fxml文件,如果需要,还有css、控制器和模型。我试图弄清楚如何更改子场景(运行时的子fxml)。有人知道怎么做吗?我有点困在这上面了。可以添加MainViewController吗?场景:用户单击任务栏中的按钮,包含的content1.fxml将替换为content2.fxml

这里是基本代码

MainApp.java

Loads the MainView.fxml
import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;

public class TaskBarController implements Initializable {

// Binding with the FXML
@FXML
private Button taskBarButton1;

@FXML
private Button taskBarButton2;

@FXML
private void handleTaskBarButton1Action(ActionEvent event) {
    System.out.println("click! taskBarButton1");
}

@FXML
private void handleTaskBarButton2Action(ActionEvent event) {
    System.out.println("click! taskBarButton2");
}

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub

}

}
MainView.fxml


不仅仅包括fxml,还要为此创建一个业务逻辑层:

<BorderPane xmlns:fx="http://javafx.com/fxml">
<center>
    <Pane fx:id="content"/>
</center>

它可以工作,thx寻求帮助,但我被迫删除TaskBar.fxml和TaskBarController.java,编写了一个带有@fxml句柄和@fxml的MainViewController用于按钮和带有fx:id=“content”的窗格,并将我的自定义按钮放在MainView.fxml中

@FXML
private void handleTaskBarButton2Action(ActionEvent event) throws IOException {
    System.out.println("click! taskBarButton2");
    content.getChildren().clear();
    content.getChildren().add((Node) FXMLLoader.load(getClass().getResource("Content2.fxml")));
}

为了我想要的功能,我准备推荐它。你甚至可以在你的孩子身上迭代并用它的id替换一个如果是这样的话如果一切都放在MainViewController中,这个系统可以正常工作,但是我想保持模块化,我怎么才能从TaskBarController获取连接到TaskBar.fxml的父节点访问权限?将是MainView.fxml中的边框窗格,然后我可以将加载的content2.fxml附加到boarderpane的中心
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>

<HBox xmlns:fx="http://javafx.com/fxml" spacing="10" alignment="center" 
     fx:id="taskBar" fx:controller="TaskBarController">
    <children>
        <Button fx:id="taskBarButton1" onAction="#handleTaskBarButton1Action"/>     
        <Button fx:id="taskBarButton2" onAction="#handleTaskBarButton2Action"/> 
    </children>
</HBox>
import java.net.URL;
import java.util.ResourceBundle;

import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;

public class TaskBarController implements Initializable {

// Binding with the FXML
@FXML
private Button taskBarButton1;

@FXML
private Button taskBarButton2;

@FXML
private void handleTaskBarButton1Action(ActionEvent event) {
    System.out.println("click! taskBarButton1");
}

@FXML
private void handleTaskBarButton2Action(ActionEvent event) {
    System.out.println("click! taskBarButton2");
}

@Override
public void initialize(URL location, ResourceBundle resources) {
    // TODO Auto-generated method stub

}

}
<BorderPane xmlns:fx="http://javafx.com/fxml">
<center>
    <Pane fx:id="content"/>
</center>
@FXML
private void handleTaskBarButton2Action(ActionEvent event) {
   System.out.println("click! taskBarButton2");
   content.getChildren().clear();
   content.getChildren().add(FXMLLoader.load(getClass().getResource("Content2.fxml"));
}
@FXML
private void handleTaskBarButton2Action(ActionEvent event) throws IOException {
    System.out.println("click! taskBarButton2");
    content.getChildren().clear();
    content.getChildren().add((Node) FXMLLoader.load(getClass().getResource("Content2.fxml")));
}