2023-02-16 367
我试图强迫GridPane的孩子适合其所在的单元格大小.在这种情况下,我正在创建一个月的视图日历,而列和行是设定的大小,而不管什么是什么在里面.
在此日历上,每个单元格包含一个正常的VBox,每个单元格包含一个标签,该标签显示该月的一天以及当天的每个事件.许多日子没有事件.他们中的一些人有一个事件;还有一些事件.
日历大小取决于窗口的大小,并将根据窗口增长和收缩.目前,如果单元格太小而无法适应所有事件,那么在细胞中,该VBox的高度就会大于单元格.
标题行具有以下约束:
HEADER_CONSTRAINT = new RowConstraints(10, -1, 500,
Priority.NEVER, VPos.BASELINE, true);
其他行具有以下约束:
ROW_CONSTRAINT = new RowConstraints(30, 30, Integer.MAX_VALUE,
Priority.ALWAYS, VPos.TOP, true);
我认为我需要做的是:
grid.add(cell, c, r);
vbox.maxHeightProperty().bind(grid.getRow(r).heightProperty()); // <-- this line is not right, but something like this.
正如@fabian正确提及的那样,VBox的大小完全取决于其孩子的大小.如果您希望有一个不调整大小大小的容器,则可以使用Pane.这样:
public void start(Stage primaryStage)
{
GridPane root = new GridPane();
Scene scene = new Scene(root, 300, 300);
int c = 0, r = 0;
Pane c0 = new Pane();
c0.setPrefSize(200, 200);
c0.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY,
new BorderWidths(1))));
root.add(c0, c, r);
primaryStage.setScene(scene);
primaryStage.show();
}
为测试添加形状:
Pane c0 = new Pane();
c0.setPrefSize(200, 200);
c0.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY,
new BorderWidths(1))));
{
Circle circle = new Circle(160, Color.BLUE);
circle.setCenterX(160);
circle.setCenterY(160);
c0.getChildren().add(circle);
}
root.add(c0, c, r);
请注意,尽管形状在c0的边界之外突出,但c0的边界留在原位,表明其大小不受影响.为了防止内容突出,您需要添加一个剪辑:
c0.setClip(new Rectangle(c0.getPrefWidth(), c0.getPrefHeight()));
如果您想要更精美的剪辑,而不是简单的修剪,例如淡入淡出,淡入淡出和阴影,则可以阅读此非常好的教程在这里.
现在,只需用您的VBox替换此Circle,以便VBox是此Pane的孩子,然后将Pane添加到您的GridPane中,然后就完成了.我将在此处提供最终代码作为参考:
public void start(Stage primaryStage)
{
GridPane root = new GridPane();
Scene scene = new Scene(root, 300, 300);
int c = 0, r = 0;
Pane c0 = new Pane();
c0.setPrefSize(200, 200);
c0.setClip(new Rectangle(c0.getPrefWidth(), c0.getPrefHeight()));
c0.setBorder(new Border(new BorderStroke(Color.RED, BorderStrokeStyle.SOLID, CornerRadii.EMPTY,
new BorderWidths(1))));
{
Circle circle = new Circle(160, Color.BLUE);
circle.setCenterX(160);
circle.setCenterY(160);
c0.getChildren().add(circle);
}
root.add(c0, c, r);
primaryStage.setScene(scene);
primaryStage.show();
}
更新:
@jai指出,在此实现中的大小是静态的.如果您希望动态调整单元格的大小,如果GridPane的大小更改,则可以将侦听器添加到其widthProperty和heightProperty之类的范围内:
int rowCount = 5, columnCount = 7; // You should know these values.
ChangeListener<Number> updater = (o, oV, nV) ->
{
double newWidth = root.getWidth() / columnCount;
double newHeight = root.getHeight() / rowCount;
root.getChildren().forEach(n ->
{
// Assuming every child is a Pane.
Pane p = (Pane) n;
p.setPrefSize(newWidth, newHeight);
p.setClip(new Rectangle(newWidth, newHeight));
});
};
root.widthProperty().addListener(updater);
root.heightProperty().addListener(updater);
替代…
如果您想使用ColumnConstraints和RowConstraints来确定可以设置Pane s的单元格大小,并且仅在侦听器中更新其剪辑,现在倾听ColumnConstraints和:
ColumnConstraints cc = new ColumnConstraints(200);
RowConstraints rc = new RowConstraints(200);
c0.setPrefSize(Double.MAX_VALUE, Double.MAX_VALUE);
c0.setClip(new Rectangle(cc.getPrefWidth(), rc.getPrefHeight()));
和…
ChangeListener<Number> updater = (o, oV, nV) ->
{
root.getChildren().forEach(n ->
{
// Assuming every child is a Pane.
Pane p = (Pane) n;
p.setClip(new Rectangle(cc.getPrefWidth(), rc.getPrefHeight()));
});
};
cc.prefWidthProperty().addListener(updater);
rc.prefHeightProperty().addListener(updater);
以上所述是小编给大家介绍的JavaFX-强制GridPane的孩子适应单元格的大小,希望对大家有所帮助,如果大家有任何疑问请给我留言,小编会及时回复大家的。在此也非常感谢大家对77isp云服务器技术网的支持!
原文链接:https://77isp.com/post/33974.html
=========================================
https://77isp.com/ 为 “云服务器技术网” 唯一官方服务平台,请勿相信其他任何渠道。
数据库技术 2022-03-28
网站技术 2022-11-26
网站技术 2023-01-07
网站技术 2022-11-17
Windows相关 2022-02-23
网站技术 2023-01-14
Windows相关 2022-02-16
Windows相关 2022-02-16
Linux相关 2022-02-27
数据库技术 2022-02-20
抠敌 2023年10月23日
嚼餐 2023年10月23日
男忌 2023年10月22日
瓮仆 2023年10月22日
簿偌 2023年10月22日
扫码二维码
获取最新动态