2016-09-23 46 views
0

當從數據庫中讀取數據以便在ObservableList TableView中顯示數據時,是否有可能進行迭代?我想在顯示每一行操作之前進行。JavaFX,對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

這不是完全清楚你的要求。如果問題是如果你可以顯示一些數據的話,答案是肯定的 - 只要數據準備好就把數據插入到表的'items'屬性中。 – Itai

+0

'tableView.setItems(data);'這樣你就可以添加要顯示的數據。在這種情況下,您需要處理所有內容並只顯示。我想處理並逐行顯示,而不是一次全部顯示。有可能嗎? – Bartek

+0

通過這種方式,我可以平滑地編輯動態選擇的行並在背景中加載數據,而無需鎖定時間 – Bartek

回答

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(); 
    } 
    } 
} 

它的工作原理像這樣的畫面:

enter image description here

+0

是否有可能當每一行是stowrzony一個新的線程?當你在一個載入大量行的所有內容都需要一點點時。而不是它的結尾在後臺運行。直到你加載它全部閃爍。單元格是可編輯的,應該可以輕鬆編輯,而無需等待加載所有數據。 – Bartek

+0

我不知道你想要什麼。你想要在新線程中加載每一行?當數據加載時,你想在同一時間編輯它們?在我的示例中,我添加了等待(3000),並且它運行緩慢,但通常它會很快,打開ViewTable後,所有內容都將可見並且加載完成。我不知道我可以如何與你聯繫,也許在波蘭語中它會更好;) – BadVegan