Как связать изменение размера сцены с изменением размера компонентов?

У меня есть приложение JavaFX 2.0 с FXML. Я хочу, чтобы компоненты (TextFields, ComboBoxes, макеты и т.д.) Изменялись при изменении размера окна с приложением. Так что...

  • Как написано на документации Oracle для JavaFX, чтобы сделать что-то вроде этого с помощью форм, существует несколько специальных свойств для фигур:

При создании 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.
    Пример однонаправленного привязки