Включение масштабного коэффициента в layoutBounds в JavaFX - PullRequest
1 голос
/ 19 марта 2020

Я использую JavaFx 8.

Из JavaDo c из javafx.scene.Node.scaleYProperty():

[...] Этот масштабный коэффициент не включен в layoutBounds by default, что делает его идеальным для масштабирования всего узла после того, как все эффекты и преобразования были приняты во внимание. [...]

Как может Я включаю масштабный коэффициент в layoutBounds, хотя?

Некоторый контекст: В следующем примере, когда нажимается кнопка Я хотел бы, чтобы GridPane реагировал также на масштабирование HBox без необходимости жестко кодировать prefHeight RowConstraints.

Возможность включения коэффициента масштабирования в layoutBounds, вероятно, сработает, но другие решения Добро пожаловать.

import javafx.application.Application;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.control.ToggleButton;
import javafx.scene.layout.*;
import javafx.stage.Stage;

public class ScalingStandAlone extends Application {

    private VBox vBox = new VBox();
    private GridPane gridPane = new GridPane();
    private HBox  hBox = new HBox();
    private ToggleButton button = new ToggleButton("Click to scale");
    private Label firstRowLabel = new Label("Some content in text form");
    private Label secondRowLabel = new Label("Some content for scaling");
    private Label thirdRowLabel = new Label("Some moving content");

    public static void main(String[] args) {
        Application.launch(args);
    }

    @Override
    public void start(Stage stage) throws Exception {
        AnchorPane root = new AnchorPane();
        AnchorPane.setTopAnchor(vBox, 5.);
        AnchorPane.setLeftAnchor(vBox, 5.);
        AnchorPane.setRightAnchor(vBox, 5.);
        root.autosize();
        Scene scene = new Scene(root);
        stage.setTitle("GridRow Scale Demo");
        stage.setWidth(400);
        stage.setHeight(300);
        stage.setScene(scene);
        stage.show();

        root.getChildren().add(vBox);
        vBox.setAlignment(Pos.CENTER);
        vBox.getChildren().add(gridPane);
        vBox.getChildren().add(button);
        vBox.setStyle("-fx-spacing: 15;");

        configureGridPane(root);

        button.setOnAction(event -> {
            hBox.setScaleY(button.isSelected() ? 2 : 1);
        });
    }

    private void configureGridPane(Pane root) {
        hBox.getChildren().add(secondRowLabel);

        // Styling //
        firstRowLabel.setStyle("-fx-padding: 5;");
        hBox.setStyle("-fx-background-color: #800000; -fx-padding: 5;");
        secondRowLabel.setStyle("-fx-text-fill: white; -fx-padding: 5;");
        thirdRowLabel.setStyle("-fx-padding: 5;");

        gridPane.add(firstRowLabel, 0, 0);
        gridPane.add(hBox, 0, 1);
        gridPane.add(thirdRowLabel, 0, 2);
        gridPane.setGridLinesVisible(true);
        gridPane.getColumnConstraints().add(new ColumnConstraints());
        gridPane.getColumnConstraints().get(0).setPercentWidth(100);
    }
}

1 Ответ

2 голосов
/ 19 марта 2020

Из Javadocs для Group:

Любое преобразование, эффект или состояние, примененные к группе, будут применены ко всем дочерним элементам этой группы. Такие преобразования и эффекты НЕ будут включены в границы макета этой группы, однако, если преобразования и эффекты установлены непосредственно для дочерних элементов этой группы, они будут включены в границы макета этой группы .

(мой акцент добавлен).

Поэтому, если вы просто оберните HBox в Group, вы достигнете желаемого эффекта:

    // gridPane.add(hBox, 0, 1);
    gridPane.add(new Group(hBox), 0, 1);
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...