我有一个大小相等的长方形的flowpane,我遇到了这个问题,当这个空间不足以容纳另一列的时候,我希望它在其他列之间平分。
我想要实现的一个例子是windows中的文件资源管理器是如何工作的,请参阅gif下面的参考文件。

默认的FlowPane行为看起来不像这样,它留下的剩余宽度不能适应区域末尾的一个新的子区域,如gif下面所示

而且我找不到任何API或文档来帮助我实现我的目标,我想在width属性上添加一个侦听器并相应地调整hGap属性,如下所示
[ flowPaneWidth - (sum of the widths of the children in one column) ] / (column count - 1)
但同样,我不知道如何计算列数,因此,任何帮助将不胜感激。
如果有人想尝试他们的想法,这里有一个MRE:
public class FPAutoSpace extends Application {
@Override
public void start(Stage ps) throws Exception {
FlowPane root = new FlowPane(10, 10);
root.setPadding(new Insets(10));
for(int i = 0; i < 20; i++) {
root.getChildren().add(new Rectangle(100, 100, Color.GRAY));
}
ps.setScene(new Scene(root, 600, 600));
ps.show();
}
}发布于 2022-07-19 11:13:54
经过一番思考,我试着实现问题中提到的想法:
在width属性上添加侦听器并相应地调整hGap属性
但是,我将侦听器添加到needsLayout属性中,如下所示:
public class FPAutoSpace extends Application {
private double nodeWidth = 100;
@Override
public void start(Stage ps) throws Exception {
FlowPane root = new FlowPane();
root.setVgap(10);
for (int i = 0; i < 20; i++) {
root.getChildren().add(new Rectangle(nodeWidth, nodeWidth, Color.GRAY));
}
root.needsLayoutProperty().addListener((obs, ov, nv) -> {
int colCount = (int) (root.getWidth() / nodeWidth);
//added 4 pixels because it gets glitchy otherwise
double occupiedWidth = nodeWidth * colCount + 4;
double hGap = (root.getWidth() - occupiedWidth) / (colCount - 1);
root.setHgap(hGap);
});
StackPane preRoot = new StackPane(root);
preRoot.setPadding(new Insets(10));
preRoot.setAlignment(Pos.TOP_LEFT);
ps.setScene(new Scene(preRoot, 600, 600));
ps.show();
}
}不确定这将如何在多个节点FlowPane中支持,但它适用于MRE。

如果你认为有更好的方法,请告诉我。
https://stackoverflow.com/questions/73035514
复制相似问题