我一直在开发一个具有mainPane窗格的应用程序,该窗格在其中存储了多个较小的窗格。
首先,我为每个按下的按钮添加一个侦听器,在按下某个特定按钮后,将出现一个相关窗格。一切正常,直到我意识到每次按下按钮都会添加一个新的窗格实例,并最终在后台某处最初选择的窗格上失去进度。
自那时以来,我尝试尝试从主父窗格的getChildren()方法中加载现有窗格,但是我在此方面并没有取得太大的成功。我试图在这里到处找到解决方案,但是找不到与我的问题相关的任何东西,或者如果我发现了某些东西,我可能根本不理解。
我的问题如下:如果我可以将子窗格添加到父窗格以使用<fa:FontAwesome Icon="Flag" FontSize="90" Foreground="Chartreuse" HorizontalAlignment="Center" />
开始,那么我添加了一个简单的布尔开关,如果添加了窗格并且此类型已被添加-尝试使其与mainPane.getChildren().add(root)
一起显示。但是,将其添加到所有其他按钮处理程序时,mainPane.getChildren().get(intArray[0]).toFront();
方法似乎按照添加窗格的顺序显示窗格。
因此,如果我最初按下按钮.toFront()
,trackerButton
,progressButton
,communityButton
-然后按下blockerButton
4次,窗格将显示-> trackerButton
,trackerPane
,progressPane
,communityPane
,如果我不断按下,则再次遍历这些内容。
有没有一种更干净的方法可以实现此目的,因此,如果我多次按一个按钮,它只会加载它的相关窗格,而不用blockerPane
添加它的新实例?
任何帮助将不胜感激,我在下面粘贴了我的代码:
mainPane.getChildren().add(root);
}
对于具有适当技能的人来说,我觉得解决方案非常简单,但是我对JavaFX还是很陌生,任何帮助将不胜感激。
亲切问候
答案 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