Как создать вертикальную метку с правильной шириной и высотой? - PullRequest
1 голос
/ 07 апреля 2019

Мне нужно визуализировать некоторые данные очень компактно.Из-за ограниченной высоты каждого контейнера данных я решил переместить заголовок каждого контейнера в сторону и повернуть его вертикально.При вращении метки она придерживается размеров своего родителя.Следовательно, максимальная длина метки ограничена шириной родительского элемента.Как я могу сделать так, чтобы метка maxWidth была фактической maxHeight родительской панели?

Для каждого контейнера я использую GridPane.Метка находится внутри StackPane для установки границы или для изменения цвета фона.

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

public class Test extends Application {

  public void start(Stage primaryStage) throws Exception {
        // Part of the code

        GridPane gridPane = new GridPane();
        StackPane namePane;
        Label nameLabel;

        // ...

        // Header
        gridPane.getColumnConstraints().add(new ColumnConstraints(40.0));
        // Index
        gridPane.getColumnConstraints().add(new ColumnConstraints(50.0));
        // Name
        gridPane.getColumnConstraints().add(new ColumnConstraints(100.0,150.0,400));

        // int rows = ...; // Any integer between 1 and 6
        int rows = 5;

        for(int i = 0; i < rows; i++) {
            gridPane.getRowConstraints().add(new RowConstraints(30));
        }

        namePane = new StackPane();

        nameLabel = new Label("Name-123456789");
        nameLabel.setStyle("-fx-rotate: -90;");

        namePane.getChildren().add(nameLabel);
        gridPane.add(namePane,0,0,1,rows);

        // ...

        // Debug only
        gridPane.setGridLinesVisible(true);

        // just for running the example
        Scene scene = new  Scene(gridPane,700,700);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

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

How it should look How it looks so far

Я уже пытался изменить maxWidth Lable на Double.MAX_VALUE без успеха.

nameLabel.setMaxWidth(Double.MAX_VALUE);

1 Ответ

2 голосов
/ 08 апреля 2019

StackPane обрабатывает Label, как если бы позиция не была изменена преобразованиями. Это также влияет на вычисленные размеры StackPane.

Чтобы исправить это, вы можете обернуть Label в Parent, который учитывает преобразования при расчете его размера: Group

namePane.getChildren().add(new Group(nameLabel));

Примечание: Это не изменяет размер Label, если высота namePane становится слишком маленькой, чтобы ее содержать. Чтобы достичь этого эффекта, вам нужно реализовать собственный макет.

...