2015-06-25 5 views
0

Я работаю над проектом javaFX, в котором мне нужен точный контроль над размером узла. Мой код в настоящее время корректно обновляет prefWidthProperty при необходимости, а минимальный и максимальный размер используется для использования размера pref, но widthProperty не обновляется.JavaFX widthProperty not refreshing

Я проверил это с заявлениями печати, добавленными как слушатели в свойства. Обновления PrefWidthProperty, widthProperty нет (до тех пор, пока я не щелкнул узел, возможно, не сфокусировался?)

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

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

Код, используемый для установки размера и проверки изменений:

//Set the size 
this.setMinSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 
this.setMaxSize(Region.USE_PREF_SIZE, Region.USE_PREF_SIZE); 
this.prefWidthProperty().bind(getTotalWidthProperty()); 

public ObservableValue<? extends Number> getTotalWidthProperty() {  
    return rightArgument.layoutXProperty().add(rightArgument.translateXProperty()).add(rightArgument.widthProperty()).add(H_GAP); 
} 

//Check for change: 
this.prefWidthProperty().addListener(p -> System.out.println("FB_Pref_"+System.currentTimeMillis() + " " + this.getPrefWidth())); 
this.widthProperty().addListener(p -> System.out.println("FB______"+System.currentTimeMillis() + " " + this.getWidth())); 

Как сказано выше, FB_Pref получает правильно печатается на время, FB_____ печатается слишком поздно.

+0

Не могли бы вы предоставить немного больше кода, пожалуйста? – NwDev

+0

Какие части вы хотели бы видеть больше? Я добавил несколько бит о том, как я устанавливаю prefWidthProperty. – i3anaan

ответ

1

Если вы установите min/max в pref, это создаст узел фиксированного размера. Размеры min/max/pref будут включены во время первой фазы макета. Ширина «свойство» отражает текущую установленную ширину на вашем узле. Поэтому, если вы не измените ширину, ваш слушатель никогда не получит событие. Вы можете sysout ширину с getWidth, это всегда возвращает текущую ширину.

Существует два типа слушателей в JavaFX, чей-лист и прослушиватель недействительности. Вы добавили регистратор аннулирования с lambdas. Это срабатывает только по мере необходимости, а не при каждом изменении только на ретрансляторе. Смотрите здесь для получения дополнительной информации: http://docs.oracle.com/javase/8/javafx/properties-binding-tutorial/binding.htm#sthref12

Просто попробуйте этот:

this.prefWidthProperty().addListener(
     (ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> { 
      System.out.println("FB_Pref_" + System.currentTimeMillis() + " " + this.getPrefWidth()); 
     }); 

this.widthProperty().addListener(
     (ObservableValue<? extends Number> observable, Number oldValue, Number newValue) -> { 
      System.out.println("FB______" + System.currentTimeMillis() + " " + this.getWidth()) 
     }); 
+0

Это, к сожалению, ничего не изменило для меня :( Если возможно, я бы хотел установить widthProperty, но это так просто невозможно. У меня возникла идея вызвать метод setWidth(), когда prefWidthProperty изменился, но в этом тоже не было Эффект – i3anaan

+0

Как вы хотели изменить prefWidth? Связано ли это с другим узлом? Метод setWidth делает это задание на widthProperty, поэтому вы можете его установить. – NwDev

+0

Хорошо, поэтому настройка ширины при изменении prefWidthProperty вызывает триггер слушатель widthProperty, а также обновляет getWidth() узла.Однако он не визуально обновляет узел. Infact, он вызывает RunTimeExceptions, устанавливая значение привязки (которое я не касался напрямую). У меня есть ощущение, что это закрывает реальную проблему ... – i3anaan

0

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

prefWidthProperty.addListener((observable, oldValue, newValue) -> { 
    Platform.runLater(() -> getParent().requestLayout()); 
}; 

По какой-то причине, выполнив Runnable позже на Application нить работ. Каждый раз, когда установлен предпочтительный размер, requestLayout() в любом случае вызывается внутри недействительным() методом MinPrefMaxProperty класса Region. Это просто заставляет обновление снова.