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




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. Однако с привязками он имеет ожидаемое поведение, и проблема была где-то в другом месте, но я нашел это с вашим объяснением, я был сосредоточен на этой метке. Большое спасибо !
Предоставьте минимальный воспроизводимый пример, демонстрирующий проблему.