我虽然不是专业的FX开发人员,但我熟悉Java。现在我有一个简单的应用程序,使用JavaFX TableView支持ObservableList。当我首次启动应用程序时,我会从Application的start方法中另外启动一个线程来监听日志文件的变化,并将另一个元素添加到ObservableList中,以便该行立即在TableView中可见。我想在窗口中添加一个标签,显示ObservableList的当前大小。我试图将Label的textProperty绑定到ObservableList的大小上。我的第一次尝试失败了:
tableSizeLabel.textProperty().bind(Bindings.size((tableView.getItems())).asString());
我认为我对Bindings API存在误解。我意识到ObservableList.size()返回的是普通int而不是必需的ObservableValue,但我认为Bindings类有一个静态方法可以为我创建ObservableValue。
后端模型将列表作为静态变量包含(我省略了监听更改部分):
控制器类:
The Controller Class:
这在FX中是否可行?我需要向整个ObservableList添加更改监听器,然后才能使用getSize()更新Label吗?
提前感谢!
tableSizeLabel.textProperty().bind(Bindings.size((tableView.getItems())).asString());
我认为我对Bindings API存在误解。我意识到ObservableList.size()返回的是普通int而不是必需的ObservableValue,但我认为Bindings类有一个静态方法可以为我创建ObservableValue。
后端模型将列表作为静态变量包含(我省略了监听更改部分):
public class LogFileListener implements Runnable {
private static final ObservableList<SNMPTrap> model = FXCollections.observableArrayList();
@Override
public void run() {
String line = null;
try (BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream(fileLocation)))) {
while ((line = br.readLine()) != null) {
model.add(parseTrap(line));
}
} catch (Exception ex) {
ex.printStackTrace();
}
}
public static ObservableList<SNMPTrap> getModel() {
return model;
}
}
应用程序类:
public class TableDisplay extends Application {
@Override
public void start(Stage stage) throws Exception {
new Thread(new LogFileListener()).start();
Parent root = FXMLLoader.load(getClass().getResource("path/to/FXML"));
Scene scene = new Scene(root);
stage.setScene(scene);
stage.show();
}
控制器类:
The Controller Class:
public class TableDisplayController implements Initializable {
@FXML
private TableView<SNMPTrap> tableView;
@FXML
private Label tableSizeLabel;
@Override
public void initialize(URL url, ResourceBundle rb) {
tableView.setItems(LogFileListener.getModel());
tableSizeLabel.textProperty().bind(Bindings.size((tableView.getItems())).asString());
}
这在FX中是否可行?我需要向整个ObservableList添加更改监听器,然后才能使用getSize()更新Label吗?
提前感谢!