Для этой цели вам необходимо переопределить вычисление минимальной ширины узла.Если вы также хотите скрыть части узла за пределами границ, вам нужно применить 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
, поскольку это позволяет сократить текст с помощью многоточия, если места недостаточно.