从父窗格加载现有的FXML

时间:2018-08-09 22:24:28

标签: java javafx parent children pane

我一直在开发一个具有mainPane窗格的应用程序,该窗格在其中存储了多个较小的窗格。

首先,我为每个按下的按钮添加一个侦听器,在按下某个特定按钮后,将出现一个相关窗格。一切正常,直到我意识到每次按下按钮都会添加一个新的窗格实例,并最终在后台某处最初选择的窗格上失去进度。

自那时以来,我尝试尝试从主父窗格的getChildren()方法中加载现有窗格,但是我在此方面并没有取得太大的成功。我试图在这里到处找到解决方案,但是找不到与我的问题相关的任何东西,或者如果我发现了某些东西,我可能根本不理解。

我的问题如下:如果我可以将子窗格添加到父窗格以使用<fa:FontAwesome Icon="Flag" FontSize="90" Foreground="Chartreuse" HorizontalAlignment="Center" /> 开始,那么我添加了一个简单的布尔开关,如果添加了窗格并且此类型已被添加-尝试使其与mainPane.getChildren().add(root)一起显示。但是,将其添加到所有其他按钮处理程序时,mainPane.getChildren().get(intArray[0]).toFront();方法似乎按照添加窗格的顺序显示窗格。

因此,如果我最初按下按钮.toFront()trackerButtonprogressButtoncommunityButton-然后按下blockerButton 4次,窗格将显示-> trackerButtontrackerPaneprogressPanecommunityPane,如果我不断按下,则再次遍历这些内容。

有没有一种更干净的方法可以实现此目的,因此,如果我多次按一个按钮,它只会加载它的相关窗格,而不用blockerPane添加它的新实例?

任何帮助将不胜感激,我在下面粘贴了我的代码:

mainPane.getChildren().add(root);

}

对于具有适当技能的人来说,我觉得解决方案非常简单,但是我对JavaFX还是很陌生,任何帮助将不胜感激。

亲切问候

1 个答案:

答案 0 :(得分:1)

问题在于,在toFront上调用Node会导致该节点移动到父布局的最后一个索引。这导致某些情况下某些索引变得错误。要解决此问题,只需存储Node,而不是数据结构中的索引即可。

还要注意,基本上所有加载代码看起来都一样,除了一些细微的差别。您应该避免重复代码,因为这会使您的代码难以维护。通过向控制器添加接口,可以轻松删除重复的代码。

@FXML
private void handlePanelButtonAction(ActionEvent event) throws IOException {
    if(event.getSource() == trackerButton) {
        ...
    } else if(event.getSource() == progressButton) {
        ...
    } else if(event.getSource() == communityButton) {
        ...
    } else if(event.getSource() == blockerButton) {
        ...
    } else if(event.getSource() == settingsButton) {
        ...
    } else if(event.getSource() == logoutButton) {
        ...
    }
}

请勿执行此类操作。如果逻辑完全不同,则Button应该收到它自己的事件处理程序方法。即使代码足够相似,您也应避免使用某些节点检查源的引用是否相等。相反,您可以将信息存储在userData的{​​{1}}或properties中。

推荐

在您的控制器上实现以下界面:

Node

使用public interface ClientContainer { void setClient(Client client); } 来初始化按钮userData

URL

使用此数据和public class MainController { ... private void setResource(Node node, String resource) { URL url = getClass().getResource(resource); if (url == null) { throw new IllegalArgumentException("Resource not available: " + resource); } node.setUserData(url); } private static URL getResource(Object source) { return (URL) ((Node) source).getUserData(); } @FXML private void initialize() { setResource(trackerButton, "/view/TrackerPane.fxml"); setResource(progressButton, "/view/ProgressPane.fxml"); setResource(communityButton, "/view/CommunityPane.fxml"); setResource(blockerButton, "/view/BlockerPane.fxml"); setResource(settingsButton, "/view/SettingsPane.fxml"); } } 避免重新加载场景。 (您还需要将用于处理Map点击的代码移到其他方法。)

logoutButton