2012-04-25 2 views
15

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

  • Как написано на Oracle documentation for 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."); 
        } 
    
    }); 
    

Итак, есть два вопроса:

  • Чтобы сделать некоторые привязки, я должен получить свою сцену в классе контроллера. Итак - как я могу получить этап в классе контроллера?
  • Похоже, что элементы управления пользовательского интерфейса не имеют свойств ширины и высоты, что-то связано с ними. Или, может быть, я их не нашел.

Итак, как я могу решить свою проблему?

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.

Как Сценарий поможет мне в этой ситуации?

ответ

7

Другой простой вариант заключается в использовании JavaFX Scene Builder (недавно стали доступны в качестве публичной бета-версии: http://www.oracle.com/technetwork/java/javafx/tools/index.html)

Это позволяет создать пользовательский интерфейс с помощью перетаскивания и падение и якорь элементов пользовательского интерфейса до границы (по anchor tool), так они перемещаются/изменяются по размеру с помощью границ окна.

UPDATE:

Для достижения автоматического изменения процентной раскладки вы можете использовать GridPane с ColumnConstraint:

public void start(Stage stage) { 

    VBox box1 = new VBox(1); 
    VBox box2 = new VBox(1); 

    //random content 
    RectangleBuilder builder = RectangleBuilder.create().width(20).height(20); 
    box1.getChildren().addAll(builder.build(), builder.build(), builder.build()); 
    builder.fill(Color.RED); 
    box2.getChildren().addAll(builder.build(), builder.build(), builder.build()); 

    //half by half screen 
    GridPane grid = new GridPane(); 
    grid.addRow(0, box1, box2); 

    ColumnConstraints halfConstraint = ColumnConstraintsBuilder.create().percentWidth(50).build(); 
    grid.getColumnConstraints().addAll(halfConstraint, halfConstraint); 

    stage.setScene(new Scene(grid, 300, 250)); 
    stage.show(); 
} 
+0

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

+0

взгляните на обновление, пожалуйста. –

+1

Typo - GripPane – Avik

3

Предложения:

  1. Если у вас есть только один основной этап затем сохранить его в статическом поле/переменной в то время как приложение запуска и доступ к нему во всех классах контроллеров.
  2. Вы можете поместить все элементы управления/компоненты в макет/панель, которая автоматически управляет макетом своих детей. Для разных макетов проверьте api doc. После этого привяжите свойства ширины и высоты сцены к свойствам этого макета соответствующим образом. Подробнее о привязке смотрите на Using JavaFX Properties and Binding.
    Пример unidirectional binding
20

Некоторые предложения для создания изменяемого ГПИ =>

  • Убедитесь, что корень вашего приложения является Pane подкласс, а не группы.
  • разжимать максимальный размер кнопок (например, button.setMaxSize (Double.MAX_VALUE, Double.MAX_VALUE).
  • Большую часть времени макета панели можно обрабатывать изменения размера для вас, и вам не нужно привязок и слушателей = > т. е. связывается только тогда, когда вам действительно нужно.
  • Элементы управления и компоновки пользовательского интерфейса - это Регионы => все Регионы имеют свойства высоты и ширины только для чтения, которые вы можете слушать и связывать.
  • Вы не можете напрямую связывать высоту и свойства ширины элемента управления для другого значения. Вместо этого используйте свойства minWidth/Height, prefWidth/Height, maxWidth/Height.
  • Сцена имеет высоту и ширину. вы можете привязать, если необходимо. Если вы сделаете это, при изменении размера сцены сцена будет изменена, а ваши связанные компоненты будут изменены. Если корень вашей сцены является панелью макета, а не группой, эта привязка обычно не нужна.
  • Если вы не задаете высоту и ширину на сцене, для автономного приложения сцена (и сцена) будет иметь размер, соответствующий размеру корневого узла сцены (обычно это то, что вы хотите).
  • Если все остальное не удается, вы можете начать отменять метод макета родителя.

Здесь находится an example изменчивого интерфейса JavaFX, который реализует некоторые из принципов выше.

Смежные вопросы