所以我正在构建一个类似于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
然后,我想将控制台小部件/视图添加到应用程序的东南象限。这将由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();
}
}
这会导致以下控制台出现在东南象限。
以编程方式这似乎有效。我的southEast锚点窗格显示,如果你看它,它的列表中有一个孩子,但我的用户界面没有变化。我需要知道如何刷新我的主控制器(或做我需要做的任何事情) )使更改显示给用户。
我创建应用程序之前我创建了一个全新的场景,因为用户经历了不同的页面,但我从未真正做过这样的事情,我需要在向窗格添加节点后更新场景。我尝试过像stage.sizeToScene()这样的东西尝试刷新它,但这对我没用。
答案 0 :(得分:1)
您必须返回AnchorPane page
而不是(Initializable) loader.getController();
才能添加到southEast
anchorPane。
声明控制器扩展另一个节点,产生controller-node
,用于创建Custom Controls。
这些控件具有用于设置Controller和Root节点的构造函数。 See this example
在您的情况下,loader.getController()
会返回AnchorPane
(而不是ConsoleWidget
),它不是从FXML加载的,而是ConsoleWidget
类的实例。