Как создать вертикальную метку с правильной шириной и высотой?

Мне нужно визуализировать некоторые данные очень компактно. Из-за ограниченной высоты каждого контейнера данных я решил сдвинуть заголовок каждого контейнера в сторону и повернуть его вертикально. При вращении этикетки она придерживается размеров своего родителя. Таким образом, максимальная длина метки ограничена шириной родителя. Как я могу добиться того, чтобы 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);
    }
}

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

Как создать вертикальную метку с правильной шириной и высотой?Как создать вертикальную метку с правильной шириной и высотой?

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

nameLabel.setMaxWidth(Double.MAX_VALUE);

Создайте MCVE.

Sedrick 08.04.2019 06:33

@Sedrick Код должен работать и представлять проблему. Кроме того, я только что добавил пример номера строки.

MarvinX 08.04.2019 09:13

код даже не компилируется (он не завершен), как он вообще может работать (в смысле представления проблемы). Пожалуйста, прочитайте указанную страницу справки и приведите пример, как было предложено.

kleopatra 08.04.2019 11:40

@kleopatra Конечно, это так. Я просто закомментировал... если вы этого не заметили.

MarvinX 08.04.2019 11:55

Вы действительно хотите, чтобы нас написал шаблон вокруг метода запуска, чтобы сделать его работоспособным? *качал головой... это проблема твой, если ты не заметил ;)

kleopatra 08.04.2019 12:00

@kleopatra Я просто подумал, что будет легче понять, когда я просто опубликую необходимый код. Я только что опубликовал полный тестовый класс. Надеюсь, это сработает для вас.

MarvinX 08.04.2019 12:19
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
6
192
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

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

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

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

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

Другие вопросы по теме