我有一个有两个孩子的HBox(一个ImageView和一个文本),但在某些条件下我想隐藏文字以强制HBox减少它。
我已经有了一个技术,它将managedProperty
绑定到visibleProperty
,但是它没有按预期工作,因为文本强制HBox宽度包含文本宽度。
我的问题是:如何禁用节点冲突(在他的父节点上),但不能将managedProperty
设置为false。 (因为这个属性使它不再保持在正确的位置)
答案 0 :(得分:0)
为此,您需要覆盖最小节点宽度的计算。如果您还想将节点的部分隐藏在边界之外,则需要将clip
应用于布局。
示例:
public class ShrinkableHBox extends HBox {
private final int unshrinkableCount;
public ShrinkableHBox(int unshrinkableCount) {
final Rectangle clip = new Rectangle();
clip.widthProperty().bind(widthProperty());
clip.heightProperty().bind(heightProperty());
setClip(clip);
this.unshrinkableCount = unshrinkableCount;
}
@Override
protected double computeMinWidth(double height) {
Insets insets = getInsets();
height -= insets.getTop() + insets.getBottom();
double width = insets.getLeft() + insets.getRight();
List<Node> children = getManagedChildren();
int unshrinkableCount = Math.min(children.size(), this.unshrinkableCount);
// only consider the first unshrinkableCount children for minWidth computation
if (unshrinkableCount > 1) {
width += getSpacing() * (unshrinkableCount - 1);
}
for (int i = 0; i < unshrinkableCount; i++) {
width += children.get(i).minWidth(height);
}
return width;
}
}
@Override
public void start(Stage primaryStage) {
// custom hbox with 2 resizeable
ShrinkableHBox hbox = new ShrinkableHBox(1);
hbox.getChildren().addAll(
new Rectangle(100, 100, Color.RED),
new Rectangle(100, 100, Color.BLUE)
);
hbox.setOpacity(0.5);
Scene scene = new Scene(new HBox(hbox, new Rectangle(100, 100, Color.GREEN.interpolate(Color.TRANSPARENT, 0.5))));
primaryStage.setScene(scene);
primaryStage.show();
}
请注意,简单地用Text
替换Label
节点也可能是一种解决方案,因为如果空间不足,可以使用省略号缩短文本。