Javafx TableView无法从observableArrayList加载数据

时间:2015-10-16 18:52:22

标签: java csv javafx

我想将csv文件加载到我的tableView中但是这里没有填充表格是我的代码。我不知道我在做什么wron

public class FXMLDocumentController implements Initializable {
File csv;
@FXML
AnchorPane anchorpane;
Stage stage;
@FXML
TableView dataTable;
@FXML
TextField path;
@FXML
public void browseOnClick(){        
    stage = (Stage) anchorpane.getScene().getWindow();
    FileChooser fileChooser = new FileChooser();
    fileChooser.setTitle("Open CSV File");
    fileChooser.setInitialDirectory(
        new File(System.getProperty("user.home"))
    );
    fileChooser.getExtensionFilters().addAll(
        new FileChooser.ExtensionFilter("Coma separated value", "*.csv")
    );
    csv =  fileChooser.showOpenDialog(stage);
    if(csv != null){
        open();
    }
}
public void open(){
    path.setText(csv.getAbsolutePath());
    loadCSV(csv, dataTable);
}
public void loadCSV(File csv,TableView table)
        {
    try {
        ObservableList<ObservableList> csvData = FXCollections.observableArrayList();    
        Scanner sc = new Scanner(csv);
            while(sc.hasNext()){
                ObservableList<String> row = FXCollections.observableArrayList();
                for(String column: sc.nextLine().split(",")){
                    row.add(column);
                }
                csvData.add(row);
            }
            table.getItems().clear();
            table.getColumns().clear();
            table.setItems(csvData);
            createColums(table, csvData.get(0).size());
        } catch (FileNotFoundException ex) {
            Logger.getLogger(FXMLDocumentController.class.getName()).log(Level.SEVERE, null, ex);
        }
}
public void createColums(TableView table,int size){
    for(int x = 1; x<size; x++){
        TableColumn t = new TableColumn("Paramiter "+x);
        t.setPrefWidth(120);
        table.getColumns().add(t);
    }
    TableColumn t = new TableColumn("Target");
    t.setPrefWidth(120);
    table.getColumns().add(t);

}
@Override
public void initialize(URL url, ResourceBundle rb) {
    path.setEditable (false);
}    
}

但是当我运行此代码时,输​​出是一个空表。 columns and rows added but there is no data

1 个答案:

答案 0 :(得分:1)

您需要一个单元格值工厂。列需要知道如何在单元格中呈现数据。最好是输入表格和列。

public void createColums(TableView table,int size){
    for(int x = 1; x<=size; x++){ //careful with indexes
        TableColumn<ObservableList<String>,String> t = new TableColumn<>("Paramiter "+x);
        t.setPrefWidth(120);
        final int X = x;
        t.setCellValueFactory(p -> new SimpleStringProperty(p.getValue().get(X-1)));
        table.getColumns().add(t);
    }
    TableColumn t = new TableColumn("Target");
    t.setPrefWidth(120);
    table.getColumns().add(t);
}

我还会使用TableView<ObservableList<String>>作为表格中的数据类型。

我没有对此进行测试,因为您只提供了一个文件。