Динамическое / мгновенное изменение размера в JavaFX - PullRequest
2 голосов
/ 03 августа 2010

Как создать приложение JavaFX, которое (мгновенно) динамически изменяет размер?Прямо сейчас я написал простое приложение, которое динамически изменяет размеры, но изменения макета не отображаются до тех пор, пока не будет отпущена кнопка мыши.Я хочу мгновенно увидеть результаты / изменения макета до выпуска этой кнопки.

Я предполагаю, что это делается просто связыванием правильных значений / элементов управления с инверсией ... Любая помощь будет отличной!


РЕДАКТИРОВАТЬ:

Вот как у меня все работает (спасибо Praeus).Именно так, как он сказал, мне пришлось привязать ширину и высоту моего контейнера / макета верхнего уровня к scene.width и scene.height.-

var scene: Scene;

Stage {
title: "Заголовок приложения"
scene: scene = Scene {
content:[
XMigLayout {
width: bind scene.width;
height: bind scene.height;
...}]}}

Ответы [ 4 ]

4 голосов
/ 28 февраля 2012

Связывание отличается в версии 2.0 JavaFX. Видео Анжелы Кайседо демонстрирует, как правильно связать свойства.Переменная должна быть настроена как ObservableNumberValue и используемые методы get и set.После настройки вы можете привязать его к свойству компонента.

DoubleProperty x = new SimpleDoubleProperty(0);
x.set(1);
x.getValue();
imageView.xProperty().bind(x);
anchorPane.heightProperty().add(x);

Пост Эрика Бруно - это еще один способ сделать это.другой, более подходящий ответ вместе с тем, где я его нашел.

3 голосов
/ 04 августа 2010

На самом деле, если вы уже все организовали в макеты, то вы можете просто привязать ширину и высоту контейнера (ов) макета верхнего уровня к scene.width и scene.height.Я не думаю, что элементы управления макетом верхнего уровня управляются чем-либо, поэтому вы можете быть спокойны, просто задав ширину и высоту элемента управления макетом напрямую.Если это не сработает, то вы можете успешно привязать ширину и высоту layoutInfo.

В идеале вы хотите использовать управление макетом, прежде чем прибегать к привязке.Чрезмерное связывание может быть проблемой производительности и может привести к медленной перерисовке при изменении размера.В этом случае вы, вероятно, можете просто использовать привязки для контейнера верхнего уровня, и тогда все дочерние элементы контейнера верхнего уровня должны соответственно изменить размер.По крайней мере, я думаю, что это должно работать.

1 голос
/ 03 августа 2010

Да, я думаю, что вы на правильных линиях - связывание было бы очевидным способом сделать то, что вы пытаетесь сделать.Вы также можете посмотреть на триггеры.

Прочтите руководство 1.3 по макетам в качестве отправной точки, если вы еще не

Контейнеры макетов автоматически управляютдинамическое поведение макета их узлов содержимого.Однако часто желательно также использовать механизм связывания скрипта JavaFX для установки определенных динамических аспектов компоновки.Например, вы можете привязать ширину и высоту контейнера HBox к высоте и ширине сцены, чтобы при изменении размера сцены размер контейнера HBox также изменялся.

Вероятно, стоит прочитать статьи и блогпосты гуру макета JavaFX Эми Фаулер

0 голосов
/ 05 октября 2018

Вот что я в итоге сделал, чтобы изменить размер, как мне понравилось. Должен быть более легкий путь, но я, конечно, не знаю этого.

Мой метод main загружает мой контроллер и сцену, а затем вызывает мой метод init () для контроллеров

        FXMLLoader loader = new FXMLLoader(getClass().getResource("sample.fxml"));
    Parent root = (Parent) loader.load();
    primaryStage.setTitle("Robot Interface");
    primaryStage.setScene(new Scene(root));
    primaryStage.show();
    Controller controller = (Controller)loader.getController();
    controller.init();

Я использую сетку, которая динамически изменяет размер, так как пользователь изменяет размер всей сцены, поэтому он всегда подходит. Это происходит из-за его размера в процентах. Это делается в формате fxml проще, чем с привязкой IMO.

<GridPane fx:id="gridPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="500.0" prefWidth="700.0" xmlns="http://javafx.com/javafx/8.0.121" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">

  <columnConstraints>
    <ColumnConstraints percentWidth="50" />
    <ColumnConstraints percentWidth="50" />
  </columnConstraints>
  <rowConstraints>
    <RowConstraints percentHeight="35" />
    <RowConstraints percentHeight="35" />
    <RowConstraints percentHeight="35" />
  </rowConstraints>
   <children>

      <TextArea fx:id="textArea_Console" prefHeight="200.0" prefWidth="200.0" promptText="console/reponse" GridPane.columnIndex="1" GridPane.rowIndex="2" />

      <!-- <MediaView fx:id="mediaView_Images" fitHeight="225.0" fitWidth="225.0" GridPane.halignment="LEFT" GridPane.valignment="BOTTOM" /> -->


      <TextArea fx:id="textArea_RoboAvail" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="121.0" prefWidth="123.0" promptText="robots available" GridPane.columnIndex="1" GridPane.halignment="RIGHT" GridPane.valignment="TOP" />

      <TextArea fx:id="textArea_SensorData" maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="249.0" prefWidth="106.0" promptText="sensor data" GridPane.halignment="RIGHT" GridPane.valignment="TOP" />

      <TextArea fx:id="textArea_Scripting" prefHeight="200.0" prefWidth="200.0" promptText="Scripting" GridPane.columnIndex="1" GridPane.rowIndex="1" />

      <Label text="Currently Viewing" GridPane.halignment="LEFT" GridPane.valignment="TOP" />

      <TextArea maxHeight="-Infinity" maxWidth="-Infinity" prefHeight="250.0" prefWidth="100.0" promptText="to do list" GridPane.columnIndex="1" GridPane.halignment="LEFT" GridPane.valignment="TOP" />

      <ImageView fx:id="imageView_Images"  fitHeight="233.0" fitWidth="225.0" pickOnBounds="true" preserveRatio="true" GridPane.halignment="LEFT" GridPane.valignment="TOP" />

      <Label fx:id="label_CheatSheet" text="Label" GridPane.halignment="LEFT" GridPane.rowIndex="2" GridPane.valignment="BOTTOM" />




   </children>

Помните, как у моего класса контроллера был вызван метод init (). Хорошо, init () вызывает setupUI, где я получаю свои высоту и ширину и позже создаю обратные вызовы для изменений высоты и ширины. Они меняют мои переменные в классе: mHeight и mWidth;

  private void setupUI()
{
    imageView_Images.setImage( new Image("file:///C:\\Users\\administration\\IdeaProjects\\Robot User Interface\\Media\\filler.jpeg"));



   mHeight = gridPane.getHeight();
   mWidth = gridPane.getWidth();

   //for initial startup sizing
    dynamicRsize();


    //callbacks to detect changes for sizing
    gridPane.widthProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            mWidth = newValue.doubleValue();
            dynamicRsize();
        }
    });

    gridPane.heightProperty().addListener(new ChangeListener<Number>() {
        @Override
        public void changed(ObservableValue<? extends Number> observable, Number oldValue, Number newValue) {
            mHeight = newValue.doubleValue();
            dynamicRsize();
        }
    });


    setup_TextArea_Scriptng();
    setup_Label_CheatSheet();

}

Наконец, я могу вызвать dynamicResize (), который корректирует каждый объект в области сетки в процентах от ширины или высоты этих строк

  private void dynamicRsize()
{
    //two columns 50/50
    //three rows 35/35/30

    double columnType1 = mWidth/2;
    double rowType1 = mHeight * .35;
    double rowType2 = mHeight * .3;

    //node 1
    imageView_Images.setFitWidth(columnType1 * .75);
    textArea_SensorData.setPrefWidth(columnType1 * .25);

   //node 2

    //node 3

    //node 4

    //node 5

    //node 6







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