是否有可能从数据库中读取数据以在ObservableList TableView中显示它们进行迭代?我想在显示每一行操作之前进行。
1. operation on line 1
2. display line 1 in tableview
3. operation on line 2
4. display line 2 in tableview
... and so on.
一切都会在后台线程中发生(服务或任务?) 操作将搜索密钥的存在并分配值。
当在TableView中编辑数据时加载所有内容时,是否可以只替换线程中的一行,以免重载整个视图?对所有人来说,工作得很快。
答案 0 :(得分:0)
我为你准备了一些代码,我希望这就是你所需要的。 一般的想法是你必须使用新线程并使用Task类。 在这里,您可以阅读更多相关信息:https://docs.oracle.com/javase/8/javafx/interoperability-tutorial/concurrency.htm
public class Main extends Application {
private TableView<Person> table = new TableView<Person>();
ArrayList<Person> listPerson = new ArrayList<>(); //this list can be filled from database
private ObservableList<Person> data;
public Main() {
listPerson.add(new Person("Ania"));
listPerson.add(new Person("Kasia"));
listPerson.add(new Person("Monika"));
listPerson.add(new Person("Jola"));
listPerson.add(new Person("Ewa"));
data = FXCollections.observableArrayList(listPerson);
}
public static void main(String[] args) {
launch(args);
}
@Override public void start(Stage stage) throws InterruptedException {
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setMinWidth(100);
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person, String>("firstName"));
table.getColumns().addAll(firstNameCol);
final VBox vbox = new VBox();
vbox.getChildren().addAll(table);
Scene scene = new Scene(vbox, 400, 400);
stage.setScene(scene);
stage.show();
//Use new thread where you can proceed your data and add dynamically to the TableVIew
Task<Void> task = new Task<Void>() {
@Override protected Void call() throws Exception {
for (Person person : listPerson) {
System.out.println("Do something with person: " + person);
synchronized (this) {
this.wait(3000);
table.getItems().add(person);
System.out.println(person + " added to table. Do the next one \n");
}
}
return null;
}
};
Thread th = new Thread(task);
th.setDaemon(true);
th.start();
}
public class Person {
private final SimpleStringProperty firstName;
public Person(String fName) {
this.firstName = new SimpleStringProperty(fName);
}
public String getFirstName() {
return firstName.get();
}
public void setFirstName(String fName) {
firstName.set(fName);
}
@Override public String toString() {
return firstName.getValue();
}
}
}
就像这张图片一样: