JavaFX - 如何将ChangeListener添加到TextArea与另一个类的String属性绑定

时间:2015-02-23 09:23:06

标签: java javafx-8

我有一个主要课程,我有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); 
        }
    });

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

2 个答案:

答案 0 :(得分:1)

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

答案 1 :(得分:1)

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

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