Слушатель изменений не обнаруживает изменения - BooleanProperty JavaFX - PullRequest
0 голосов
/ 10 января 2019

Я пытался выяснить, как обнаружить изменения в некоторых свойствах объекта. Итак, в начале я понял, как это сделать, и это работает. Я не знаю, есть ли лучший способ сделать это (если вы, ребята, знаете, есть ли лучший способ, скажите мне, пожалуйста).

Ну, проблема в том, что мне нужно решить еще одну проблему, и я не хочу обнаруживать изменения, я просто хочу получить новые заданные значения свойств. Итак, я знаю, что с помощью интерфейса javafx.beans.value.ChangeListener вы можете обнаруживать каждое изменение какого-либо свойства, и это моя проблема, потому что я создал класс, который реализует ChangeListener (с типом Object, для обнаружения изменений нескольких свойств типа. Например, Boolean , Целое и т. Д.) И по какой-то причине не обнаруживает все изменения Позвольте мне показать вам пример кода:

 CustomInterface ci = new CustomInterface();

 for ( XBeeNode snode : nodes ) {

        Sensors sensors = snode.getSensors();
        ci.setMessagePacket(messagePacket);
        ci.setNode(snode);

        sensors.luxLowProperty().addListener(ci);
        ci.setProperty(sensors.luxLowProperty());
        sensors.luxLowProperty().set((int) luxesController.minSlider.getValue());

        sensors.luxHighProperty().addListener(ci);
        ci.setProperty(sensors.luxHighProperty());
        sensors.luxHighProperty().set((int) luxesController.maxSlider.getValue());

        sensors.luxIntermediateProperty().addListener(ci);
        ci.setProperty(sensors.luxIntermediateProperty());
        sensors.luxIntermediateProperty().set((int) luxesController.medSlider.getValue());

        sensors.photocellProperty().addListener(ci);
        ci.setProperty(sensors.photocellProperty());
        sensors.setPhotocell(luxesController.pheToggleButton.selectedProperty().getValue()); 
}

Я перебираю некоторые объекты "узлов" и получаю значения из элементов управления пользовательского интерфейса, чтобы установить для них свойства узлов. А вот основная часть класса CustomInterface:

public class CustomInterface implements javafx.beans.value.ChangeListener<Object> {

Property property;
MessagePacket messagePacket;
XBeeNode node;
boolean someValueHasChanged = false;


public CustomInterface() {
}

public CustomInterface(Property property, MessagePacket messagePacket, XBeeNode node) {
    setProperty(property);
    setMessagePacket(messagePacket);
    setNode(node);
}

@Override
public void changed(ObservableValue<? extends Object> observable, Object oldValue, Object newValue) {

    Sensors sensors = node.getSensors();

    System.out.println(newValue);

    if (newValue != oldValue)
        someValueHasChanged = true;

    if (newValue instanceof Number)
    {
        if (newValue != oldValue || GeneralConstants.ForceMode.get()) {
            String value = ((Number)newValue).toString();
            if (property.equals(sensors.luxLowProperty()))
                messagePacket.setParameter(PARAM.LUX_LOW, value);
            else if (property.equals(sensors.luxIntermediateProperty()))
                messagePacket.setParameter(PARAM.LUX_INTERMEDIATE, value);
            else if (property.equals(sensors.luxHighProperty()))
                messagePacket.setParameter(PARAM.LUX_HIGH, value);


        }
    } else if (newValue instanceof Boolean)
    {
        if ( ((! newValue.equals(oldValue)) || GeneralConstants.ForceMode.get())) {
            if (property.equals(sensors.photocellProperty()))
                messagePacket.setParameter(PARAM.EXTERN_PHOTOCELL_MODE, (sensors.photocellProperty().get()) ? "1" : "0");
            else if (property.equals(sensors.movementProperty()))
                messagePacket.setParameter(PARAM.MOVEMENT_SENSOR, (sensors.movementProperty().get()) ? "1" : "0");

        }
    }

    property.removeListener(this);

}
}

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

Ответы [ 2 ]

0 голосов
/ 23 января 2019

Хорошо, я обнаружил, что ChangeListener не запускается, если свойство не становится недействительным, это происходит только тогда, когда значение свойства меняет свое значение (старое значение должно отличаться от нового значения).

Есть несколько способов решения проблемы. Я нашел 2 обсуждения здесь в StackOverflow, может быть, может помочь вам:

  1. [ JavaFX ObjectProperty, который запускает события изменения, даже если newValue == oldValue
  2. [ Как заставить слушатель свойства JavaFX запускать событие, даже если oldVaule и newValue совпадают?

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

0 голосов
/ 10 января 2019
property.removeListener(this);

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

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