gpt4 book ai didi

JavaFX 子 AnchorPane 添加到父 AnchorPane 后不显示

转载 作者:太空宇宙 更新时间:2023-11-04 06:29:06 25 4
gpt4 key购买 nike

所以我正在致力于构建一个类似于 IDE 的应用程序,例如 Eclipse 或 Netbeans。我想要有不同的区域,用户可以选择一些内容,例如将显示在其中一个区域中的 View 。我的第一次尝试是将控制台 View 添加到我的一个区域。在我的应用程序类中,我使用以下代码创建整体 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

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

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 anchor Pane 显示,如果您查看它,它的列表中有 1 个子项,但是我的 UI 没有更改。 我需要知道如何刷新我的主 Controller (或执行任何我需要执行的操作)以使更改显示给用户。

我之前创建过应用程序,当用户浏览不同的页面时,我创建了一个全新的场景,但我从未真正做过这样的事情,我需要在将节点添加到 Pane 后更新场景。我尝试过诸如 stage.sizeToScene() 之类的方法来尝试刷新它,但这对我来说没有用。

最佳答案

您必须返回 AnchorPane 页面 而不是 (Initialized) loader.getController(); 才能添加到 southEast anchor Pane 。

声明一个扩展另一个节点的 Controller ,会产生一个 Controller 节点,用于创建 Custom Controls .

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

就您而言,loader.getController() 返回一个 AnchorPane(而不是 ConsoleWidget),它不是从 FXML 加载的,而是 ConsoleWidget 类的实例。

关于JavaFX 子 AnchorPane 添加到父 AnchorPane 后不显示,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26366354/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com