JavaFX дети влияют на ширину родителя - PullRequest
0 голосов
/ 03 июня 2018

У меня есть HBox с двумя дочерними элементами (ImageView и текст), но при определенных условиях я хочу скрыть текст, чтобы заставить HBox уменьшить его.У меня уже есть метод, который состоит в связывании managedProperty с visibleProperty, но он не работает должным образом, потому что текст заставляет ширину HBox включать ширину текста.

Мой вопрос: как я могу отключитьстолкновение узла (на его родителе), но не установка managedProperty в ложь.(поскольку это свойство больше не поддерживает правильное положение)

1 Ответ

0 голосов
/ 03 июня 2018

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...