我的目标是拥有一个包含3个窗格的程序。一个多元化的Auth。第一个窗格将使用用户键入密码,而第二个窗口将允许用户从下拉列表中选择图像。但是我希望在使用选择同一“主”阶段的图像后,第三个窗格在第二个窗格的右侧启动。
不寻找有人编写程序的人只是指出我想要做的正确方向。我的搜索技巧都失败了,要么我没有正确解释,要么就是另一个词。
答案 0 :(得分:1)
我会通过并排放置3个窗格来实现它,并为您加载的第一个FXML文件留空。然后我会有另一个具有相同布局的FXML文件,其中包含您希望在这些窗格中显示的内容。
然后使用它,您可以根据请求控制控制器(例如当用户点击提交或者您希望它们显示时)通过ID获取第二个FXML文件上的窗格内的内容并将其加载到窗格中。
我做了类似的事情,更改了锚定窗格并保留了工具栏与原始工具栏,因此当我回到家时,我可以添加更多内容,并且应该能够提供一些经过修改的代码以适应您的问题。
编辑1 :抱歉,我急着提交我不得不去的潜水,但我现在在移动设备上,所以我可以编辑但不能添加很多,只是觉得我需要比方说,你可以使用不同的选项来做这个,这就是为什么我只是说一个窗格而不是任何特定的。只是想提交一些东西,这样你就可以开始寻找正确的方向,直到我能够更新。
编辑2 :好了,我现在回家了,我尝试了这个,并且能够让这个工作。我就是这样做的。
所以我有两个FXML文件。但是,只显示了项目启动时显示的框,其中一个区域包含您的项目。每个区域都由AnchorPane包围。我使用AnchorPane作为容器,所以我可以换掉它里面的东西。然后,我有了第二个FXML文件,其中包含您想要显示的所有框,其中所有框都包含在AnchorPanes中。这是解释我的意思的图片。
我有第一个名为initial.fxml
的窗格,第二个窗格名为grabfrom.fxml
。对于窗格名称,我只将其作为pane1,pane2和pane3。最后,我所拥有的方法是show2()
和show3()
,并在AnchorePanes内部单击相应的按钮时从FXML调用它们。
初始化时,我只是从我的主类的start方法正常加载它,这就是完成所需的全部工作。我们只有它,所以我们可以在需要之前显示没有显示框的东西。
现在是重要部分
使用show2()
中的内容,当按下第一个窗格内的按钮(从头开始)时调用该内容。
public void show2() throws IOException{
AnchorPane toSetPane2=(AnchorPane) FXMLLoader.load(getClass().getResource("grabfrom.fxml"));
toSetPane2=(AnchorPane) toSetPane2.lookup("#pane2");
pane2.getChildren().setAll(toSetPane2);
}
这样做是将grabfrom.fxml
加载到我们投射到锚窗格的临时变量中。 (请注意,这是有效的,因为你可以在屏幕截图中看到整个FXML文件是一个锚定窗格。如果你没有那样使用它,你可以取出你的投射并投射到你正在使用或不投射的东西它是什么。)
然后将我们刚刚创建的var设置为我们需要的AnchorPane,这是我们正在添加的第二个。它使用.lookup("#ID");
方法完成此操作,以获得我们需要的窗格。
最后,它会将当前pane2
内的所有内容设置为toSetPane2
。
这可以全部压缩成一行,但是,为了便于阅读,我将其保留原样。
您应该可以在应用程序的一部分中使用这种加载方法来加载第三个,以及在任何情况下您想要的任何其他部分。
编辑3 :
同样@Swatarianess已经说过,有栈窗口,这个方法可以处理你可以设置ID的任何东西,这样它们也能正常工作。我使用了AnchorPanes,因为我已经对它们做了很多工作,并且有一些我可以回收的代码,同时对它进行测试,因此它更容易。如果你使用它们,你所要做的只是转换为StackPane而不是像这样的AnchorPane:
public void show2() throws IOException{
StackPane toSetPane2=(StackPane) FXMLLoader.load(getClass().getResource("grabfrom.fxml"));
toSetPane2=(StackPane) toSetPane2.lookup("#pane2");
pane2.getChildren().setAll(toSetPane2);
}
答案 1 :(得分:0)
窗格之间的转换可以使用stackpane完成。