Когда обновляется свойство ширины метки?

Я использую Pane для печати некоторых Label, добавляя их в список своих потомков. По какой-то причине мне нужно привязать ширину метки, но когда я делаю что-то вроде:

public class LabelTestApp extends Application
{
    private Pane root = new Pane();
    private Label myLabel = new Label("test");

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

    @Override
    public void start(Stage stage)
    {
        root.getChildren.add(myLabel);
        System.out.println(myLabel.widthProperty());
        stage.setScene(new Scene(root, 500, 500);
        stage.show();
     }
}

Кажется, что Label не обновляет свою ширину. Когда я распечатываю это с помощью:

System.out.println(myLabel.widthProperty());

Я получил :

ReadOnlyDoubleProperty [bean : Label@xxxxxxxx[styleClass = label]'test', name:width, value: 0.0]

Итак, я полагаю, что ширина метки рассчитывается во время макета, а поскольку у панели нет диспетчера макетов, она никогда не рассчитывается, я прав?

Если да, то как мне получить эту ширину?

Если нет, проблема в другом, и я не могу понять, где.

Для информации: мне нужно использовать панель, чтобы нарисовать несколько Shape, и контролировать их размещение. Этикетка предназначена для печати некоторой информации о формах. Мне нужна ширина метки, потому что на фигурах есть Line, и я не хочу, чтобы они пересекали метку.

Не стесняйтесь спрашивать дополнительную информацию.

Предоставьте минимальный воспроизводимый пример, демонстрирующий проблему.

kleopatra 20.09.2018 17:06

@kleopatra Я внес правку, чтобы прояснить вопрос.

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

Ответы 1

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

JavaFX размещает только видимые компоненты.

Вы можете убедиться в этом, если попробуете что-то вроде этого:

final Label myLabel = new Label("test");
final Pane myPane = new Pane(myLabel);

System.out.println(myLabel.getWidth());

stage.setScene(new Scene(myPane, 640, 480));
stage.show();

System.out.println(myLabel.getWidth());

который печатает

0.0
19.5

Как вы можете видеть здесь, размер метки не устанавливается до вызова stage.show(). Вы также можете переопределить Pane, чтобы увидеть, что layoutChildren() вызывается впервые на этом этапе.

В качестве примечания: если вы хотите узнать ширину некоторого текста, не показывая его в рабочей области, вы можете создать узел Text (вместо метки) и получить его предпочтительную ширину, например

new Text("test").prefWidth(0)

Надеюсь это поможет!

Да, я пытался напечатать ширину этикетки, прежде чем показывать ее, это объясняет, почему значение, напечатанное на консоли, было 0,0. Однако с привязками он имеет ожидаемое поведение, и проблема была где-то в другом месте, но я нашел это с вашим объяснением, я был сосредоточен на этой метке. Большое спасибо !

Racapuce 21.09.2018 09:32

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