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