2015-04-18 30 views
8

問題如何將新的數據正確地添加到TableView中,滾動到它

我想動態數據添加到TableView中並滾動到新的數據的位置。但是,當TableView中一列到達視口大小,我得到這個在控制檯:

2015年4月18日上午九點14分34秒com.sun.javafx.scene.control.skin.VirtualFlow addTrailingCells INFO:索引超過maxCellCount。檢查大小 類javafx.scene.control.TableRow的計算

所以我想我做錯了什麼。我所做的只是使用Oracle的TableView例子,補充一點:

// button to add new data 
Button bt = new Button("Add"); 
bt.setOnAction(e -> { 

    // insert new item 
    int i = data.size() + 1; 
    Person person = new Person("Name " + i, "Name " + i, "Mail " + i); 
    data.add(person); 

    // scroll to new item 
    table.scrollTo(person); 

}); 

同樣的情況,當你使用

table.getItems().add(person); 

不是修改名單。

罪魁禍首是scrollTo方法。當您使用scrollTo方法使用行索引時,會發生相同的信息/錯誤。

問題

你如何正確地添加新的項目到TableView中,使信息/錯誤顯示不出來?

代碼

這裏有一個完整的例子。表格已預先填好。如果點擊添加按鈕,則視口尺寸已達到,並且控制檯中顯示信息(或錯誤?)。

public class TableViewSample extends Application { 

    private TableView<Person> table = new TableView<Person>(); 
    private final ObservableList<Person> data = FXCollections.observableArrayList(); 

    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage stage) { 
     Scene scene = new Scene(new Group()); 
     stage.setTitle("Table View Sample"); 
     stage.setWidth(450); 
     stage.setHeight(500); 

     table.setEditable(true); 

     TableColumn firstNameCol = new TableColumn("First Name"); 
     firstNameCol.setMinWidth(100); 
     firstNameCol.setCellValueFactory(
       new PropertyValueFactory<Person, String>("firstName")); 

     TableColumn lastNameCol = new TableColumn("Last Name"); 
     lastNameCol.setMinWidth(100); 
     lastNameCol.setCellValueFactory(
       new PropertyValueFactory<Person, String>("lastName")); 

     TableColumn emailCol = new TableColumn("Email"); 
     emailCol.setMinWidth(200); 
     emailCol.setCellValueFactory(
       new PropertyValueFactory<Person, String>("email")); 

     table.setItems(data); 
     table.getColumns().addAll(firstNameCol, lastNameCol, emailCol); 

     // ------------------------------- 
     // dynamically add data 
     // ------------------------------- 

     // fill table with data 
     for(int i=0; i < 14; i++) { 
      Person person = new Person("Name " + i, "Name " + i, "Mail " + i); 
      data.add(person); 
     } 

     // button to add new data 
     Button bt = new Button("Add"); 
     bt.setOnAction(e -> { 

      // insert new item 
      int i = data.size() + 1; 
      Person person = new Person("Name " + i, "Name " + i, "Mail " + i); 
      data.add(person); 

      // scroll to new item 
      table.scrollTo(person); 

     }); 

     // ------------------------------- 

     final VBox vbox = new VBox(); 
     vbox.setSpacing(5); 
     vbox.getChildren().addAll(table, bt); 

     ((Group) scene.getRoot()).getChildren().addAll(vbox); 

     stage.setScene(scene); 
     stage.show(); 


    } 

    public static class Person { 

     private final SimpleStringProperty firstName; 
     private final SimpleStringProperty lastName; 
     private final SimpleStringProperty email; 

     private Person(String fName, String lName, String email) { 
      this.firstName = new SimpleStringProperty(fName); 
      this.lastName = new SimpleStringProperty(lName); 
      this.email = new SimpleStringProperty(email); 
     } 

     public String getFirstName() { 
      return firstName.get(); 
     } 

     public void setFirstName(String fName) { 
      firstName.set(fName); 
     } 

     public String getLastName() { 
      return lastName.get(); 
     } 

     public void setLastName(String fName) { 
      lastName.set(fName); 
     } 

     public String getEmail() { 
      return email.get(); 
     } 

     public void setEmail(String fName) { 
      email.set(fName); 
     } 
    } 
} 
+0

你要始終滾動到'TableView'的底部? – ItachiUchiha

+0

不,可能存在新行不在底部的用例。示例:焦點位於第5行,用戶向下滾動到第100行。第5行不可見。用戶按下「插入」按鈕。行應添加到位置6,並且應將表格滾動到該新行。 – Roland

+0

對我來說就像是一個bug,因爲只有在'TableView'不包含ScrollBar時纔會發生這種情況。 – eckig

回答

1

我有過這樣的警告,但你不必擔心它beause提到here

發生這種情況時 永遠是額外的細胞的最大數量應能以適應視口,如果每一個細胞都具有1 的高度。如果指數曾超過此數,則抵消不增加快 不夠,或者根本,這意味着有一些錯誤的細胞 大小計算。(排隊2.48:

這可能是我們造成的,因爲我們在你的榜樣比普通用戶或其他東西,在RC-代碼和更快的滾動table.scrollTo(person);滾動如果你有很多行,那麼更快

+5

當您銷售產品並且用戶在控制檯中看到此信息時,他們會感到懷疑。所以忽略它不是一個選項。 – Roland

+1

這是對的,可能是,我們希望他們在未來的更新中處理它。但我不明白用戶如何看到它(警告),除非你給他他的代碼!從技術上講,它不會影響性能。這就是爲什麼我選擇忘記它,並等待修復更新。 –

+0

每個用戶都可以使用可在Java控制面板中激活的Java控制檯來查看日誌信息。 – Roland

-1

我沒有找到一個解決方案,但問題不在於使用scrollTo()方法它總是發生在你滾動到底部(甚至手動)並增加窗口高度滾動消失時,我不知道爲什麼需要通過重新設置日誌管理器打開一個bug票

+0

這將滾動到列表的底部。原來的問題是滾動到一個特定的行。 –

1

禁止警告:

import javafx.application.*; 
import javafx.stage.*; 
import javafx.scene.*; 
import javafx.scene.control.*; 
import javafx.scene.control.cell.*; 
import javafx.scene.layout.*; 
import javafx.beans.property.*; 
import javafx.collections.*; 

import java.util.logging.LogManager; 

public class TableViewSample extends Application { 
    // ... setup ... 

    public static void main(String[] args) { 

    // Suppress the warning message when the Add button is clicked. 
    LogManager.getLogManager().reset(); 

    launch(args); 
    } 

這將影響整個應用程序的記錄。如果不需要,請將違規級別(com.sun.javafx.scene.control.skin.VirtualFlow)的日誌記錄級別更改爲Level.OFF

參見:

由於這是一個警告信息,大概可以忽略不計,因此抑制。據我所知,新行已成功添加。下面是在,檢查有問題的代碼,國際海事組織,違反了最小驚訝原則:

相關問題