Когда обновляется метка widthProperty? - PullRequest
0 голосов
/ 20 сентября 2018

Я использую 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 на фигурах, и я не хочу, чтобы они пересекали метку.

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

1 Ответ

0 голосов
/ 21 сентября 2018

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)

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

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