■[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); } }