JavaFX - 如何将 ChangeListener 添加到与来自其他 class 的 StringProperty 绑定的 TextArea

JavaFX - how to add ChangeListener to TextArea binded with StringProperty from other class

我有一个主 class,其中有 TextArea 显示我的程序的一些日志。它看起来像这样:

@FXML
private TextArea eventLog;

我需要从其他 classess(场景)访问它,所以它像这样与 StringProperty 绑定:

eventLog.textProperty().bind(LogInfo.logDataProperty());

LogInfo 如下所示:

public class LogInfo {

private static StringProperty logData = new SimpleStringProperty();

public static void setLogData(String data) {
        logData.set(getLogData() + data);
    }

}

setLogData 基本上是复制已存储在 TextArea eventLog 上的所有信息并添加新行。它工作正常,但我的问题来了:

当显示新信息时,TextArea 不滚动。我需要像这样将 ChangeListener 添加到我的 eventLog textArea:

eventLog.textProperty().addListener(new ChangeListener<Object>() {
        @Override
        public void changed(ObservableValue<?> observable, Object oldValue,
                Object newValue) {
            eventLog.setScrollTop(Double.MAX_VALUE); 
        }
    });

它不起作用,因为信息是由 setLogData 从 LogInfo class 添加的,而不是直接从 eventLog TextArea 添加的。所以我需要在我的 LogInfo class 上实现 ChangeListener,但问题是我无法从 LogInfo class 控制 eventLog TextArea。有什么方法可以从这个 class 制作类似反向绑定的东西吗?

您需要对属性进行双向绑定 see this older post 以获取更多信息。

将侦听器直接绑定到 LogInfo 属性 而不是将其绑定到 TextArea 属性:

Main.logDataProperty().addListener((observable, oldValue, newValue) -> {
            textArea.setScrollTop(Double.MAX_VALUE);
        });