【JavaFX】csvファイルをTableViewに表示するプログラム

■[JavaFX]csvファイルをTableViewに表示するプログラム

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.Optional;
import java.util.StringTokenizer;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Alert;
import javafx.scene.control.Alert.AlertType;
import javafx.scene.control.ButtonType;
import javafx.scene.control.Menu;
import javafx.scene.control.MenuBar;
import javafx.scene.control.MenuItem;
import javafx.scene.control.SeparatorMenuItem;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellDataFeatures;
import javafx.scene.control.TableView;
import javafx.scene.layout.BorderPane;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Callback;
public class CsvView extends Application {
    ObservableList<String> headers = FXCollections.observableArrayList();
    ObservableList<ObservableList> data = FXCollections.observableArrayList();
    FileChooser fileChooser = new FileChooser();
    TableView<ObservableList> table;
    @Override
    public void start(Stage stage) {
        stage.setTitle("Csvファイル表示");
        Group root = new Group();
        Scene scene = new Scene(root,400,250);
        MenuBar menuBar = new MenuBar();
        generateMenu(menuBar, stage);
        table = new TableView();
        BorderPane borderPane = new BorderPane();
        borderPane.prefHeightProperty().bind(scene.heightProperty().subtract(0));
        borderPane.prefWidthProperty().bind(scene.widthProperty());
        borderPane.setTop(menuBar);
        borderPane.setCenter(table);
        ((Group) scene.getRoot()).getChildren().addAll(borderPane);
        stage.setScene(scene);
        stage.show();
    }
    private void generateMenu(MenuBar menuBar, Stage stage) {
        // Menu File
        Menu menuFile = new Menu("ファイル");
        menuBar.getMenus().addAll(menuFile);
        // MenuItem Exit
        MenuItem open = new MenuItem("CSVファイルを開く");
        open.setOnAction(new EventHandler<ActionEvent>() {
            public void handle(ActionEvent t) {
                fileChooser.setTitle("CSVファイルを開く");
                fileChooser.getExtensionFilters().clear();
                fileChooser.getExtensionFilters().addAll(
                        new FileChooser.ExtensionFilter("CSVファイル", "*.csv"),
                        new FileChooser.ExtensionFilter("全てのファイル", "*.*")
                );
                File file = fileChooser.showOpenDialog(stage);
                if (file != null) {
                    readCSV(file);
                }
            }
        });
        // MenuItem Exit
        MenuItem exit = new MenuItem("Exit");
        exit.setOnAction((ActionEvent t) -> {
            System.exit(0);
        });
        menuFile.getItems().addAll(open, new SeparatorMenuItem(), exit);
    }
    void readCSV(File file) {
        try {
            if (checkBeforeReadfile(file)) {
                FileInputStream in = new FileInputStream(file);
                InputStreamReader sr = new InputStreamReader(in, "sjis");
                BufferedReader br = new BufferedReader(sr);
                String line;
          Alert alrt = new Alert(AlertType.NONE,"",ButtonType.YES,ButtonType.NO);
          alrt.setTitle("ヘッダーの有無指定");
          alrt.setHeaderText(null);
          alrt.setContentText("ヘッダー(1行目)にタイトルを含みますか?");
          Optional<ButtonType> result = alrt.showAndWait();
          boolean colomnhead=false;
          if (result.get() == ButtonType.YES) {
           colomnhead = true;
          }
          data.clear();
          headers.clear();
          table.getColumns().clear();
          String linedata;
          linedata=br.readLine();
          if(linedata == null || linedata.isEmpty()) {
           return;
          }
          StringTokenizer token2 = new StringTokenizer(linedata, ",");
          if(colomnhead) {
                    while (token2.hasMoreTokens()) {
                  headers.add(token2.nextToken());
                    }
          }else {
                    while (token2.hasMoreTokens()) {
                  headers.add(null);
                  token2.nextToken();
                    }
                    StringTokenizer token3 = new StringTokenizer(linedata, ",");
                    ObservableList<String> lineList2 = FXCollections.observableArrayList();
                    while (token3.hasMoreTokens()) {
                        lineList2.add(token3.nextToken());
                    }
           data.add(lineList2);
       }
          while ((line = br.readLine()) != null) {
           StringTokenizer token = new StringTokenizer(line, ",");
           ObservableList<String> lineList = FXCollections.observableArrayList();
                    while (token.hasMoreTokens()) {
                        lineList.add(token.nextToken());
                    }
           data.add(lineList);
          }
            } else {
                System.out.println("No file exists or can't open.");
            }
        } catch (FileNotFoundException e) {
            System.out.println("FileNotFoundException : " + e.getMessage());
        } catch (IOException e) {
            System.out.println("IOException : " + e.getMessage());
        }
        generateTable();
    }
    private void generateTable() {
        int colN = 0;
        TableColumn[] column = new TableColumn[headers.size()];
        for (String colName : headers) {
            final int idx = colN;
            column[colN] = new TableColumn(colName);
            column[colN].setCellValueFactory(
                    new Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>>() {
                        @Override
                        public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {
                            return new SimpleStringProperty(param.getValue().get(idx).toString());
                        }
                    });
            colN++;
        }
        table.getColumns().addAll(column);
        table.setItems(data); // finally add data to tableview
    }
    boolean checkBeforeReadfile(File file) {
        if (file.exists()) {
            if (file.isFile() && file.canRead()) {
                return true;
            }
        }
        return false;
    }
    public static void main(String[] args) {
        launch(args);
    }
}