У меня проблема с моим InvalidationListener. Он установлен как Listener для SimpleStringProperty. Но он предназначен только для первого изменения SimpleStringProperty. Я вошел в режим отладки и сделал точку прерывания на строке, которая вызывает SimpleStringProperty :: set, и она начала работать, пока я не удалил точку останова.InvalidationListener выполняется только в режиме отладки с точкой останова
Я сделал короткую исполняемую программу примера, которая имитирует модификацию SimpleStringProperty с помощью таймера. Вы можете запустить программу один раз без точек разрыва и один раз, имеющей точку останова на этой линии: property.set(value);
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.scene.Scene;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Duration;
public class Main extends Application {
private SimpleStringProperty property;
private int counter;
@Override
public void start(Stage stage) {
// open a window to avoid immediately termination
stage.setWidth(800);
stage.setHeight(600);
BorderPane pane = new BorderPane();
stage.setScene(new Scene(pane));
stage.show();
// create a SimpleObjectProperty
property = new SimpleStringProperty();
property.addListener(observable ->
System.out.println("New value is: " + counter)
);
counter = 0;
// create timer to change 'property' every second
Timeline timeline = new Timeline();
KeyFrame keyFrame = new KeyFrame(Duration.seconds(2), event ->{
String value = "" + ++counter;
System.out.println("Set property to: " + value);
property.set(value);
});
timeline.getKeyFrames().add(keyFrame);
timeline.setCycleCount(Timeline.INDEFINITE);
timeline.playFromStart();
}
public static void main(String[] args) {
launch(args);
}
}
Выход на моей машине (Linux Mint 16.04 64bit, Oracle-Java 1.8.0_111):
Set property to: 1
New value is: 1
Set property to: 2
Set property to: 3
Set property to: 4
...
Пожалуйста, объясните мне:
- Почему слушатель не вызывается при каждом изменении?
- Почему прослушиватель называется, когда я устанавливаю точку прерывания?
- Что делать, чтобы заставить его работать без перерывов?
Пожалуйста, откройте новый вопрос для этих вещей. – Zerlono