JavaFX自定义固定尺寸组件尺寸不生效内容不裁剪问题咨询
核心问题原因&解决方案
父类选择错误
你当前继承的Control是JavaFX标准控件的基类,自带Skin皮肤、控件行为等冗余逻辑,不适合纯承载绘制内容的轻量面板。这类仅用于展示自定义绘制内容的组件,直接继承Pane即可:Pane是Region的轻量扩展,公开了子节点操作接口,没有多余的控件逻辑,完全满足你的需求。未开启边界裁剪
JavaFX默认所有容器都不会自动裁剪超出自身边界的子节点内容,这是你没有看到预期裁剪效果的核心原因。只需要在组件构造方法中添加setClipToBounds(true),超出组件边界的内容就会被自动裁剪。尺寸设置优化
你不需要重写所有computeXXX尺寸计算方法,只需要将最小、首选、最大尺寸统一设置为目标值,再重写isResizable()返回false,父布局就会严格遵守该固定尺寸。
修改后的完整代码
package pkg; import javafx.collections.ObservableList; import javafx.scene.Group; import javafx.scene.Node; import javafx.scene.layout.Pane; import javafx.scene.shape.Line; import javafx.scene.transform.Translate; public class TestPane extends Pane { public TestPane() { // 固定尺寸设置 setMinSize(150, 150); setPrefSize(150, 150); setMaxSize(150, 150); // 开启边界裁剪 setClipToBounds(true); populate(); } @Override public boolean isResizable() { return false; } private void populate() { // 建议将内部绘制内容放到单独Group中,避免平移影响组件本身的布局坐标 Group contentGroup = new Group(); Translate translate = new Translate(-25, -25); contentGroup.getTransforms().add(translate); ObservableList<Node> children = contentGroup.getChildren(); for (int i = 0; i < 4; i++) { Line line = new Line(0, i * 50, 200, i * 50); children.add(line); line = new Line(i * 50, 0, i * 50, 200); children.add(line); } getChildren().add(contentGroup); } }
效果验证
- 放入
FlowPane时,所有TestPane会严格按照150x150的尺寸排列,超出边界的网格内容会被自动裁剪,和你预期的效果一致。 - 如果你需要滚动条效果,只需要将200x200的contentGroup直接放入
ScrollPane,设置ScrollPane的视口尺寸为150x150即可,不需要封装成固定尺寸组件。
内容的提问来源于stack exchange,提问作者Will Hartung
相关产品推荐
相关产品推荐

