2016-06-01 4 views
4

java fxml에서 .csv 파일에서 데이터를 가져옵니다. 동적보기와 행을 테이블보기에 추가하고 열을 추가했지만 행은 추가하지 않습니다. 인터넷을 검색하고 검색 중이지만 적절한 결과를 얻을 수 없습니다.Java fxml의 TableView에 동적 열과 행을 추가하는 방법

내 코드 : -

public class FXMLDocumentController { 

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

    Employee ee; 

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

    public void Insert() { 
     List<String> columns = new ArrayList<String>(); 
     List<String> rows = new ArrayList<String>(); 
     ObservableList<ObservableList> csvData = FXCollections.observableArrayList(); 

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

         } 

         tableColumns = new TableColumn[columns.size()]; 
         columnIndex = 0; 
         for (String columName : columns) { 

          //System.out.println("dynamic.FXMLDocumentController.Insert()"+columns.size()); 
          tableColumns[columnIndex++] = new TableColumn(columName); 
         } 

         tableView.getColumns().addAll(tableColumns); 
        } else { 
         ObservableList<String> row = FXCollections.observableArrayList(); 
         items = l.split(","); 
         for (String item:items) { 

          row.add(item); 
         } 
         csvData.add(row); 
         System.out.println("hi"); 

        } 
        i++; 
        tableView.getItems().add(csvData); 
       } 
      } else { 
       System.out.println("File Not Found"); 
      } 
     } catch (Exception e) { 
      System.out.println(e); 
     } 

    } 
} 

답변

10

당신이없는 것은 그것의 세포에 표시 할 열에게 어떤 가치를 말할 것이다 당신의 컬럼에 대한 cellValueFactory입니다. 이 같은

뭔가 :

TableView<ObservableList<String>> tableView = new TableView<>(); 
List<String> columnNames = dataGenerator.getNext(N_COLS); 
for (int i = 0; i < columnNames.size(); i++) { 
    final int finalIdx = i; 
    TableColumn<ObservableList<String>, String> column = new TableColumn<>(
      columnNames.get(i) 
    ); 
    column.setCellValueFactory(param -> 
      new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)) 
    ); 
    tableView.getColumns().add(column); 
} 

샘플 응용 프로그램

이 솔루션은 나라 얀의 블로그 게시물에 약간 기반으로했다 : Updated: Dynamic TableView Data From Database. 이 블로그 게시물보다는 테스트 데이터 생성기를 사용하여 더미 데이터와 Java 8 람다 기능을 생성하여 셀 값 팩토리 정의를 쓰기 쉽고 보이지 않게 만듭니다.

fix off by one error

import javafx.application.Application; 
import javafx.beans.property.ReadOnlyObjectWrapper; 
import javafx.collections.*; 
import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.stage.Stage; 

import java.util.*; 

public class DynamicTableView extends Application {  
    private static final int N_COLS = 5; 
    private static final int N_ROWS = 1_000; 

    public void start(Stage stage) throws Exception { 
     TestDataGenerator dataGenerator = new TestDataGenerator(); 

     TableView<ObservableList<String>> tableView = new TableView<>(); 

     // add columns 
     List<String> columnNames = dataGenerator.getNext(N_COLS); 
     for (int i = 0; i < columnNames.size(); i++) { 
      final int finalIdx = i; 
      TableColumn<ObservableList<String>, String> column = new TableColumn<>(
        columnNames.get(i) 
      ); 
      column.setCellValueFactory(param -> 
        new ReadOnlyObjectWrapper<>(param.getValue().get(finalIdx)) 
      ); 
      tableView.getColumns().add(column); 
     } 

     // add data 
     for (int i = 0; i < N_ROWS; i++) { 
      tableView.getItems().add(
        FXCollections.observableArrayList(
          dataGenerator.getNext(N_COLS) 
        ) 
      ); 
     } 

     tableView.setPrefHeight(200); 

     Scene scene = new Scene(tableView); 
     stage.setScene(scene); 
     stage.show(); 
    } 

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

    private static class TestDataGenerator { 
     private static final String[] LOREM = "Lorem ipsum dolor sit amet, consectetur adipiscing elit. Nunc tempus cursus diam ac blandit. Ut ultrices lacus et mattis laoreet. Morbi vehicula tincidunt eros lobortis varius. Nam quis tortor commodo, vehicula ante vitae, sagittis enim. Vivamus mollis placerat leo non pellentesque. Nam blandit, odio quis facilisis posuere, mauris elit tincidunt ante, ut eleifend augue neque dictum diam. Curabitur sed lacus eget dolor laoreet cursus ut cursus elit. Phasellus quis interdum lorem, eget efficitur enim. Curabitur commodo, est ut scelerisque aliquet, urna velit tincidunt massa, tristique varius mi neque et velit. In condimentum quis nisi et ultricies. Nunc posuere felis a velit dictum suscipit ac non nisl. Pellentesque eleifend, purus vel consequat facilisis, sapien lacus rutrum eros, quis finibus lacus magna eget est. Nullam eros nisl, sodales et luctus at, lobortis at sem.".split(" "); 

     private int curWord = 0; 

     List<String> getNext(int nWords) { 
      List<String> words = new ArrayList<>(); 

      for (int i = 0; i < nWords; i++) { 
       if (curWord == Integer.MAX_VALUE) { 
        curWord = 0; 
       } 

       words.add(LOREM[curWord % LOREM.length]); 
       curWord++; 
      } 

      return words; 
     } 
    } 
} 
관련 문제