JavaFX-如何将ChangeListener添加到与其他类的StringProperty绑定的TextArea中



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

@FXML
private TextArea eventLog;

我需要从其他无类(场景)访问它,所以它与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事件日志上的所有信息,并添加新行。它运行良好,但我的问题来了:

显示新信息时,TextArea不会滚动。我需要将ChangeListener添加到我的事件日志文本区域,如下所示:

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

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

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

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

您需要对属性进行双向绑定。有关更多信息,请参阅这篇旧文章。

最新更新