添加到父AnchorPane后,JavaFX子AnchorPane未显示

时间:2014-10-14 17:07:50

标签: java javafx

所以我正在构建一个类似于IDE的应用程序,比如Eclipse或Netbeans。我希望有不同的区域,用户可以在这些区域中选择一个将显示在其中一个区域中的视图。我的第一次尝试是在我的区域上添加一个控制台视图。在我的应用程序类中,我使用以下代码创建整个UI:

public void initialize() {
    try {
        mainController = (MainController) replaceSceneContent("/layout/main.fxml");
    }catch (Exception ex) {
        Logger.getLogger(MyApplication.class.getName()).log(Level.SEVERE, null, ex);
    }
}

private Initializable replaceSceneContent(String fxml) throws Exception {

    FXMLLoader loader = new FXMLLoader();
    InputStream in = MyApplication.class.getResourceAsStream(fxml);
    loader.setBuilderFactory(new JavaFXBuilderFactory());
    loader.setLocation(MyApplication.class.getResource(fxml));

    AnchorPane page;
    try {
        page = (AnchorPane) loader.load(in);
    } finally {
        in.close();
    } 

    Scene scene = new Scene(page);
    stage.setScene(scene);
    stage.sizeToScene();

    return (Initializable) loader.getController();
}

这导致以下UI enter image description here

然后,我想将控制台小部件/视图添加到应用程序的东南象限。这将由MainController处理。理论上,如果有人选择Console视图,它将在其中一个象限中弹出,但是现在我只想在启动时加载它。我尝试使用以下代码执行此操作:

public class MainController extends AnchorPane implements Initializable{

@FXML
SplitPane west, east;
@FXML
AnchorPane northWest, southWest, northEast, southEast, applicationHeader;
@FXML
MenuBar menuBar;

Stage stage;

@Override
public void initialize(URL arg0, ResourceBundle arg1) {
    try {
        ConsoleWidget cw = (ConsoleWidget)loadWidget("/widget/console.fxml");
        southEast.getChildren().add(cw);
    } catch (Exception e) {
        e.printStackTrace();
    }
}

private Initializable loadWidget(String fxml) throws Exception {

    FXMLLoader loader = new FXMLLoader();
    InputStream in = MainController.class.getResourceAsStream(fxml);
    loader.setBuilderFactory(new JavaFXBuilderFactory());
    loader.setLocation(MainController.class.getResource(fxml));

    AnchorPane page;
    try {
        page = (AnchorPane) loader.load(in);
    } finally {
        in.close();
    } 

    return (Initializable) loader.getController();
}
}

这会导致以下控制台出现在东南象限。 enter image description here

以编程方式这似乎有效。我的southEast锚点窗格显示,如果你看它,它的列表中有一个孩子,但我的用户界面没有变化。我需要知道如何刷新我的主控制器(或做我需要做的任何事情) )使更改显示给用户。

我创建应用程序之前我创建了一个全新的场景,因为用户经历了不同的页面,但我从未真正做过这样的事情,我需要在向窗格添加节点后更新场景。我尝试过像stage.sizeToScene()这样的东西尝试刷新它,但这对我没用。

1 个答案:

答案 0 :(得分:1)

您必须返回AnchorPane page而不是(Initializable) loader.getController();才能添加到southEast anchorPane。

声明控制器扩展另一个节点,产生controller-node,用于创建Custom Controls

这些控件具有用于设置Controller和Root节点的构造函数。 See this example

在您的情况下,loader.getController()会返回AnchorPane(而不是ConsoleWidget),它不是从FXML加载的,而是ConsoleWidget类的实例。