Мне нужно визуализировать некоторые данные очень компактно. Из-за ограниченной высоты каждого контейнера данных я решил сдвинуть заголовок каждого контейнера в сторону и повернуть его вертикально. При вращении этикетки она придерживается размеров своего родителя. Таким образом, максимальная длина метки ограничена шириной родителя. Как я могу добиться того, чтобы 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);
@Sedrick Код должен работать и представлять проблему. Кроме того, я только что добавил пример номера строки.
код даже не компилируется (он не завершен), как он вообще может работать (в смысле представления проблемы). Пожалуйста, прочитайте указанную страницу справки и приведите пример, как было предложено.
@kleopatra Конечно, это так. Я просто закомментировал... если вы этого не заметили.
Вы действительно хотите, чтобы нас написал шаблон вокруг метода запуска, чтобы сделать его работоспособным? *качал головой... это проблема твой, если ты не заметил ;)
@kleopatra Я просто подумал, что будет легче понять, когда я просто опубликую необходимый код. Я только что опубликовал полный тестовый класс. Надеюсь, это сработает для вас.




StackPane обрабатывает Label так, как если бы позиция не была изменена преобразованиями. Это также влияет на вычисленные размеры StackPane.
Чтобы исправить это, вы можете обернуть Label в Parent, который учитывает преобразования при расчете его размера: Group
namePane.getChildren().add(new Group(nameLabel));
Примечание: Это не изменяет размер Label, если высота namePane становится слишком маленькой, чтобы вместить его. Чтобы добиться такого эффекта, вам нужно реализовать свой собственный макет.
Создайте MCVE.