在java fxml中将动态列和行数据添加到TableView

时间:2016-06-03 10:37:17

标签: javafx

我正在向表视图添加动态列和行,并且列正在添加但不添加行。我正在尝试和搜索互联网我得到一个结果。它将我的所有csv文件列数据添加到一行。

我的代码: -

public class FXMLDocumentController {`

    @FXML
    private TableView tableView;
    String headers[] = null;
    String items[] = null;

    Employee ee;
    List<String> columns = new ArrayList<String>();
    List<String> rows = new ArrayList<String>();
    ObservableList<ObservableList> csvData = FXCollections.observableArrayList();

    @FXML
    private void initialize() {
        Insert();
    }

    public void Insert() {

        try {
            int columnIndex = 0;
            TableColumn[] tableColumns;
            File f = new File("C:\\Users\\admin\\Desktop\\Project\\shipforecast\\Data\\Recieve\\ShipId-1432530905282-1.csv");
            if (f.exists() && !f.isDirectory()) {
                FileReader fin = new FileReader(f);
                BufferedReader in = new BufferedReader(fin);
                String l;
                int i = 0;

                while ((l = in.readLine()) != null) {

                    if (i < 1) {
                        headers = l.split(",");

                        for (String w : headers) {
                            columns.add(w);

                        }
                        for (int ii = 0; ii < columns.size(); ii++) {
                            final int finalIdx = ii;
                            TableColumn<ObservableList<String>, String> column = new TableColumn<>(
                                    columns.get(ii)
                            );

                           // column.setText("hghjghjg");
                           column.setCellValueFactory(param ->
                    new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx))
            );

                             /*System.out.println(new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)));*/

                            tableView.getColumns().addAll(column);
                        }

                        //tableView.getColumns().addAll(tableColumns);
                    } else {
                        ObservableList<String> row = FXCollections.observableArrayList();
                        row.clear();
                        items = l.split(",");
                        for (String item : items) {
                            System.out.println(item);
                            row.add(item);
                       }
                        csvData.add(row);
                    }
                    i++;

                    tableView.getItems().add(csvData);

                }
            } else {
                System.out.println("File Not Found");
            }
        } catch (Exception e) {
            e.printStackTrace();
        }

    }
}

结果: - enter image description here

请为此问题提供合适的解决方案......

3 个答案:

答案 0 :(得分:2)

删除

tableView.getItems().add(csvData);

每次从文件中读取一行时,都会将整个列表列表添加到表格视图的数据列表中(因此您可以获得表格中相同元素列表的n份副本) s项目清单),

并添加行

tableView.setItems(csvData);
while循环之后

(这告诉表使用列表列表作为其数据列表)。

如果您使用正确的类型,而不是原始类型(IDE提供的所有警告都是有原因的那样),那么编译器将为您捕获这些错误。即:

import java.io.BufferedReader;
import java.io.File;
import java.io.FileReader;
import java.util.ArrayList;
import java.util.List;

import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;

public class FXMLDocumentController {

    @FXML
    private TableView<ObservableList<String>> tableView;
    String headers[] = null;
    String items[] = null;

    // Employee ee;
    List<String> columns = new ArrayList<String>();
    List<String> rows = new ArrayList<String>();
    ObservableList<ObservableList<String>> csvData = FXCollections.observableArrayList();

    @FXML
    private void initialize() {
        Insert();
    }

    public void Insert() {

        File f = new File(
                "C:\\Users\\admin\\Desktop\\Project\\shipforecast\\Data\\Recieve\\ShipId-1432530905282-1.csv");
        if (f.exists() && !f.isDirectory()) {

            try (
                FileReader fin = new FileReader(f);
                BufferedReader in = new BufferedReader(fin);
            ) {
                String l;
                int i = 0;

                while ((l = in.readLine()) != null) {

                    if (i < 1) {
                        headers = l.split(",");

                        for (String w : headers) {
                            columns.add(w);

                        }
                        for (int ii = 0; ii < columns.size(); ii++) {
                            final int finalIdx = ii;
                            TableColumn<ObservableList<String>, String> column = new TableColumn<>(columns.get(ii));

                            // column.setText("hghjghjg");
                            column.setCellValueFactory(
                                    param -> new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)));

                            /*
                             * System.out.println(new
                             * ReadOnlyObjectWrapper<>(param.getValue().get(
                             * finalIdx)));
                             */

                            tableView.getColumns().add(column);
                        }

                        // tableView.getColumns().addAll(tableColumns);
                    } else {
                        ObservableList<String> row = FXCollections.observableArrayList();
                        row.clear();
                        items = l.split(",");
                        for (String item : items) {
                            System.out.println(item);
                            row.add(item);
                        }
                        csvData.add(row);
                    }
                    i++;

                }

                tableView.setItems(csvData);

            } catch (Exception e) {
                e.printStackTrace();
            }
        } else {
            System.out.println("File Not Found");
        }

    }
}

答案 1 :(得分:0)

我得到了这个James_D和thanq .....的答案。

public class FXMLDocumentController implements Initializable {

@FXML private TableView tableView;
 List<String> columns = new ArrayList<String>();

@Override
public void initialize(URL url, ResourceBundle rb) {
    // TODO
    try {

        CsvReader products = new CsvReader("C:\\Users\\admin\\Desktop\\Project\\shipforecast\\Data\\Recieve\\ShipId-1432530905282-1.csv");

        products.readHeaders();

                   String s[]=products.getHeaders();
                   //int count=0;

                   for(int i=0;i<s.length;i++)
                   {
                       columns.add(s[i]);
                   }
                   System.out.println(columns.size());
                   TableColumn [] tableColumns = new TableColumn[columns.size()];     
                  int columnIndex = 0;
                  for(int  k=0 ; k<columns.size(); k++) {
                  final int j = k;
                 TableColumn col = new TableColumn(columns.get(k));




    col.setCellValueFactory(new Callback<TableColumn.CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){                   
       public ObservableValue<String> call(TableColumn.CellDataFeatures<ObservableList, String> param) {                                                                                             
            return new SimpleStringProperty(param.getValue().get(j).toString());                       
        }                   
    });
    tableView.getColumns().addAll(col);
}
while (products.readRecord())
        {
                     ObservableList<String> row = FXCollections.observableArrayList();    
                    for(int x=0;x<s.length;x++)
                    {

                        int count=0;
                    //System.out.println(s[x]);
            String Valid = products.get(s[x]);
                            row.addAll(Valid);



        }

                    tableView.getItems().add(row);
                    }

}   catch (Exception ex) {    
       ex.printStackTrace();
    }    

} }

答案 2 :(得分:0)

String[] title = new String[]{"name","address","email"};
        for (String t : title) {
        TableColumn<Model,Object> col = new TableColumn<>(t.toUpperCase());
        col.setCellValueFactory(new PropertyValueFactory<>(t));
        table.getColumns().add(col);
    }



   table.getItems().add(new Model("Haroon","Kapisa","info@gmail.com"));