JavaFX: Как заставить мой пользовательский компонент использовать все доступное пространство из родительского макета? - PullRequest
5 голосов
/ 22 марта 2012

Я пытаюсь создать пользовательский компонент для javafx, поэтому я делаю, чтобы мой класс расширял javafx.scene.control.Control и в конструкторе он отображал его содержимое.

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

Это сокращенный пример того, что я делаю:

@Override
public void start(Stage primarystage) throws Exception {
    BorderPane bpane = new BorderPane();
    mainscene = new Scene(bpane, 800, 600);
    ((BorderPane) this.mainscene.getRoot()).setCenter(t);

    primarystage.setScene(mainscene);
    primarystage.show();
}

В этом примере TextArea получит все пространство, предоставленное макетомдля этого.Я хочу, чтобы мой компонент делал то же самое!

Все, что я уже пытался сделать: - изменить свойства setMaxWidth / Height, setPrefWidth / Height, setMinWidth / Height;(когда я устанавливаю MinValues, он всегда использует эти значения для рисования, но больше не обновляет значение "width") - Попытался использовать Double.MAX_VALUE, чтобы принудительно увеличить размер, а не использовать макет;Все не сработало :( Должно быть, я как-то ошибаюсь ... - Я тоже немного заплакал, но даже это не дает ничего работать = '(

Может быть, подсказка, я поставил слушателя вот так,и каждый раз, когда я изменяю размер моего приложения / этапа, он обновляет TextArea. Но когда я добавляю этот слушатель, выполняю свой компонент, он никогда не обновляется ...

TextArea t = new TextArea("teste");
t.widthProperty().addListener(new ChangeListener() {
  public void changed(ObservableValue observable, Object oldValue, Object newValue) {
    System.out.println(oldValue + "|" + newValue);
  }
});

Возможно, я передаю некоторые свойства или что-то забываю,Я не знаю ...

Я уже пробовал Google, но, похоже, документация по JavaFX слишком мала и поверхностна, и многие из них основаны на скрипте JavaFX ...

Я также принимаю любой учебник лучше, чем тот, который предлагает Oracle ...

Заранее спасибо за любую помощь ... Я много писал ... = O

Ответы [ 2 ]

16 голосов
/ 23 марта 2012

Я обнаружил, что я ошибался ...

Чтобы компонент вырос с его родителем, все, что вам нужно сделать, это определить для maxwidth и / или maxheight его максимальное значение double (как показано ниже)), и пусть minwidth / height и prefwidth / height с его значениями по умолчанию.

this.setMaxWidth(Double.MAX_VALUE);
this.setMaxHeight(Double.MAX_VALUE);

В этой конфигурации, когда родитель изменяет доступное пространство, он будет использовать последний метод setWidth () / setHeight ()чтобы обновить ширину / высоту ваш компонент может использовать.Итак, поскольку эти методы являются окончательными, вы не можете переопределить их, чтобы «знать», когда происходит изменение.Вам необходимо добавить список изменений, как показано ниже, чтобы получать уведомления о необходимости перекраски компонента.

t.widthProperty().addListener(new ChangeListener() {
  public void changed(ObservableValue observable, Object oldValue, Object newValue) {
    System.out.println(oldValue + "|" + newValue);
  }
});
4 голосов
/ 01 февраля 2014

Я обнаружил (для Java 8) - что пользовательские элементы управления корректно изменяют размер только внутри родительского узла, когда они принадлежат GridPane, HBox, VBox или, предпочтительно, StackPane.Пример Oracle CustomControl использует VBox.Я не смог получить изменение размера для работы с AnchorPane в качестве верхнего узла моего пользовательского элемента управления, даже если явно установить maxWidth & maxHeight

Так что исправленный CustomControl.fxml выглядит так:1005 * и CustomControl.java расширяет StackPane (вместо VBox)

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