Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/331.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx子项溢出流窗格_Java_User Interface_Javafx_Fxml - Fatal编程技术网

Javafx子项溢出流窗格

Javafx子项溢出流窗格,java,user-interface,javafx,fxml,Java,User Interface,Javafx,Fxml,我正在重做一个我用过的,因为我想在JavaFX中得到一些实践,因为我明年将在uni中需要它,它将给我更多的ui自由度,而不是处理。这意味着我对javafx还不熟悉,抱歉 我正在尝试在我的主窗口中放置一个容器,其中包含一些窗格。在这些窗格上,我稍后将单独绘制。我用了一个流程窗格,较小的窗格只是,嗯,窗格。我想,如果窗口的大小发生变化,就会创建(删除)更多的窗格,使容器上始终可以看到完美数量的窗格(这有点难以解释,但看看下面链接的图片,你就会明白了)。这在99%的时间内运行良好,但有时窗格会溢出流窗

我正在重做一个我用过的,因为我想在JavaFX中得到一些实践,因为我明年将在uni中需要它,它将给我更多的ui自由度,而不是处理。这意味着我对javafx还不熟悉,抱歉

我正在尝试在我的主窗口中放置一个容器,其中包含一些窗格。在这些窗格上,我稍后将单独绘制。我用了一个流程窗格,较小的窗格只是,嗯,窗格。我想,如果窗口的大小发生变化,就会创建(删除)更多的窗格,使容器上始终可以看到完美数量的窗格(这有点难以解释,但看看下面链接的图片,你就会明白了)。这在99%的时间内运行良好,但有时窗格会溢出流窗格。我尝试了很多来解决这个问题(非常野蛮地强迫它lol),但我没有比这个更好的了

不良行为

期望行为


如果你想亲自尝试的话,你可以选择这个项目

控制器的代码:

公共类主窗口控制器{
private int sizeOfOneGame=100;//以像素为单位
//容纳所有游戏的窗格框架与游戏之间的空间
private int[]paddingAroundGames={30,30,30,30};//上、右、下、左
//两局之间的空间
private int[]gapBetween游戏={10,10};//X,Y
@FXML
FlowPane flowPaneGames;
公共无效初始化(){
//在流程窗格中设置两个游戏之间的空间
flowPaneGames.setHgap(游戏之间的间隙[0]);
flowPaneGames.setVgap(游戏之间的间隙[1]);
//设置所有游戏和流程窗格边框之间的间距
setPadding(新的插图(paddingroundgames[0],paddingroundgames[1],paddingroundgames[2],paddingroundgames[3]);
//围绕流程窗格绘制一个框架
flowPaneGames.setStyle(“-fx边框颜色:黑色”);
//将窗格与中心对齐
flowPaneGames.setAlignment(位置基线\中心);
//将侦听器添加到保存游戏的流程窗格的宽度和高度->在大小更改时调整显示的窗格
flowPaneGames.widthProperty().addListener(e->FlowPaneGamesizeChanged());
flowPaneGames.heightProperty().addListener(e->FlowPaneGamesizeChanged());
}
私有void FlowPaneGamesizeChanged(){
//TODO:有时某些窗格比流程窗格大
//游戏x和y的可用空间
int totalSpaceX=(int)(flowPaneGames.getWidth()-paddingroundgames[1]-paddingroundgames[3]+gap-between-games[0]);
int totalSpaceY=(int)(flowPaneGames.getHeight()-paddingroundgames[0]-paddingroundgames[2]+gap-between-games[1]);
int TOTATLSIZEOFNEGAMEX=SIZEOFNEGAME+GAP游戏之间[0];
int TOTATLSIZEOFNEGAMEY=SIZEOFNEGAME+游戏之间的间隙[1];
int totalSpaceForGamesX=(int)((双精度)totalSpaceX/(双精度)totalsizeofonegamex));
int totalSpaceForGamesY=(int)((两倍)totalSpaceY/(两倍)TotalSizeoFonegamey));
//游戏总数
int totalSpaceForGames=totalSpaceForGamesX*totalSpaceForGamesY;
System.out.println(“宽度:“+flowPaneGames.getWidth());
System.out.println(“高度:+flowPaneGames.getHeight());
//我们有更多的游戏显示,我们应该删除最后一个
while(flowPaneGames.getChildren().size()>totalSpaceForGames){
//我们取消了最后一场比赛
flowPaneGames.getChildren().remove(flowPaneGames.getChildren().size()-1);
}
//虽然我们有较少的游戏显示,我们应该增加新的
while(flowPaneGames.getChildren().size()
如果有人能帮我解决这个问题,我会非常高兴的(即使它只发生在少数情况下),因为它确实困扰着我


旁注:我已经在这里问过这个问题,但我在这个问题上几乎没有努力,结果几乎没有任何答案,这次我试图做得更好。Ppl还抱怨我没有真正遵循java的命名约定,我试着听听,希望代码现在读起来更好。

问题的原因是没有考虑容器的边框宽度。要将容器的边框宽度考虑在内,
totalSpaceX
totalSpaceY
必须按如下方式确定:

int totalSpaceX = (int) (flowPaneGames.getWidth() - paddingAroundGames[1] - paddingAroundGames[3] + gapBetweenGames[0] - flowPaneGames.getBorder().getStrokes().get(0).getWidths().getLeft() - flowPaneGames.getBorder().getStrokes().get(0).getWidths().getRight());
int totalSpaceY = (int) (flowPaneGames.getHeight() - paddingAroundGames[0] - paddingAroundGames[2] + gapBetweenGames[1] - flowPaneGames.getBorder().getStrokes().get(0).getWidths().getTop() - flowPaneGames.getBorder().getStrokes().get(0).getWidths().getBottom());
左图显示了集装箱高度和宽度分别为
492
,并考虑了集装箱的边界宽度。默认情况下,容器的边框宽度为
1
。宽度正好有4个子窗格:
492=2 x容器边框宽度(=1)+2*填充(=30)+3*间隙(=10)+4*子窗格宽度(=100)
。这同样适用于高度

如果宽度和/或高度减少了
1
1
子窗格的宽度和/或高度都会被忽略。中间的图形显示容器高度和宽度<<代码> 491 /代码>每个都考虑容器的边框宽度。

如果不考虑容器的边框宽度,则假定的空间比实际可用的空间大,并且创建的子窗格过多。右图显示了集装箱的高度和宽度
491
每个,而不考虑边界宽度(即显示当前代码的作用)

编辑:

根据@Slaw的建议,
totalSpaceX
totalSpaceY
可以进行计算
int totalSpaceX = (int) (flowPaneGames.getWidth() - flowPaneGames.snappedLeftInset() - flowPaneGames.snappedRightInset() + gapBetweenGames[0]);
int totalSpaceY = (int) (flowPaneGames.getHeight() - flowPaneGames.snappedTopInset() - flowPaneGames.snappedBottomInset() + gapBetweenGames[1]);