Как связать изменение размера сцены с изменением размера компонентов?
У меня есть приложение JavaFX 2.0 с FXML.
Я хочу, чтобы компоненты (TextFields, ComboBoxes, макеты и т.д.) Изменялись при изменении размера окна с приложением.
Так что...
При создании GUI-приложений с JavaFX вы заметите, что некоторые классы API уже реализуют свойства. Например, класс javafx.scene.shape.Rectangle
содержит свойства для arcHeight
, arcWidth
, height
, width
, x
и y
. Для каждого из этих свойств будут соответствующие методы, которые соответствуют ранее описанным соглашениям. Например, getArcHeight()
, setArcHeight(double)
, arcHeightProperty()
, которые вместе указывают (как разработчикам, так и инструментам), что данное свойство существует. *
-
Чтобы добавить слушателя на сцену, я должен сделать что-то вроде:
stage.resizableProperty().addListener(new ChangeListener<Boolean>(){
@Override
public void changed(ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2){
throw new UnsupportedOperationException("Not supported yet.");
}
});
Итак, есть два вопроса:
- Чтобы сделать некоторые привязки, я должен получить свою ступень в классе контроллера. Итак - как я могу получить этап в классе контроллера?
- Похоже, что элементы управления пользовательского интерфейса не имеют свойств width\height, которые должны быть привязаны к чему-то. Или, возможно, я их не нашел.
Итак, как я могу решить свою проблему?
UPD. О сценаристе Сергея Гринева: когда я использую Ctrl + K на моем компоненте (скажите, чтобы он занимал всю область его родительского компонента) - все в порядке.
Но что, если я хочу сказать, что мой компонент занимает 50% области?
Например, у меня есть вкладка с двумя VBoxes.
Ширина закладки 100px. Ширина Vbox 50px для каждого. VBox1 имеет x1 = 0 и x2 = 50, а VBox2 имеет x1 = 50, а x2 = 100,
Затем я изменяю размер окна с помощью приложения JavaFX.
Теперь у меня есть вкладка Width = 200px.
Но моя ширина VBoxes по-прежнему равна 50px: VBox1 имеет x1 = 0 и x2 = 50, а VBox2 имеет x1 = 150 и x2 = 200.
И мне нужно, чтобы они были VBox1 x1 = 0 и x2 = 100 и VBox2 x1 = 100 и x2 = 200 > .
Где значения x1 и x2 являются координатами углов VBoxes.
Как сценарий поможет мне в этой ситуации?
Ответы
Ответ 1
Еще один простой вариант - использовать JavaFX Scene Builder (недавно стал доступным как публичная бета-версия: http://www.oracle.com/technetwork/java/javafx/tools/index.html)
Он позволяет создавать пользовательский интерфейс с помощью элементов перетаскивания и привязки элементов интерфейса к границам (посредством
Ответ 2
Некоторые предложения по созданию resizable guis = >
- Убедитесь, что корень вашего приложения является подклассом Pane, а не группой.
- Отмените максимальный размер кнопок (например, button.setMaxSize(Double.MAX_VALUE, Double.MAX_VALUE).
- В большинстве случаев панели макета могут обрабатывать изменение размера для вас, и вам не нужны привязки и прослушиватели = > то есть привязывать только тогда, когда вам действительно нужно.
- Элементы управления и макеты пользовательского интерфейса - это Регионы = > все регионы имеют свойства высоты и ширины только для чтения, которые вы можете слушать и привязывать.
- Вы не можете напрямую связывать свойства высоты и ширины элемента управления с другим значением. Вместо этого используйте свойства minWidth/Height, prefWidth/Height, maxWidth/Height.
- Сцена имеет свойства высоты и ширины, которые вы можете привязать, если необходимо. Если вы сделаете это, при изменении размера сцены сцена будет изменена, а ваши связанные компоненты будут изменены. Если корень вашей сцены является панелью макета, а не группой, эта привязка обычно не нужна.
- Если вы не задаете высоту и ширину на сцене, для автономного приложения сцена (и сцена) будет иметь размер, соответствующий размеру корня сцены node (обычно это то, что вы хотите).
- Если все остальное не удается, вы можете начать отменять метод родительского макета.
Вот пример изменяемого размера интерфейса JavaFX, который реализует некоторые из вышеприведенных принципов.
Ответ 3
Предложения:
- Если у вас есть только один основной этап, сохраните его в статическом поле/переменной во время запуска приложения и доступа к нему во всех классах контроллера.
- Вы можете поместить все элементы управления/компоненты в макет/панель, которая автоматически управляет макетом своих детей. Для разных макетов проверьте api doc. После этого привяжите свойства сцены и высоты сцены к этим свойствам макета соответствующим образом. Подробнее о привязке смотрите Использование свойств и привязки JavaFX.
Пример однонаправленного привязки