
CSV ファイルを読み込んで TableView に表示させるサンプルを前回紹介しましたが、サンプルの完成度が低かったので、手直しをしたものを掲載しました。
動作環境は次の通りです。
- OS: WIndows 8.1 (64bit)
- Java: Java SE 1.8.0_40-b25
- IDE: NetBeans IDE 8.0.2
リスト:TableViewSample.java
package tableviewsample;
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.StringTokenizer;
import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.scene.Group;
import javafx.scene.Scene;
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.VBox;
import javafx.stage.FileChooser;
import javafx.stage.Stage;
import javafx.util.Callback;
public class TableViewSample extends Application {
public static void main(String[] args) {
launch(args);
}
ObservableList<String> headers = FXCollections.observableArrayList();
ObservableList<ObservableList> data = FXCollections.observableArrayList();
TableView<ObservableList> table;
@Override
public void start(Stage stage) {
Scene scene = new Scene(new Group(), 600, 400);
stage.setTitle("CSV Read Sample");
MenuBar menuBar = new MenuBar();
generateMenu(menuBar, stage);
table = new TableView();
VBox vbox = new VBox();
vbox.getChildren().addAll(menuBar, table);
vbox.prefWidthProperty().bind(scene.widthProperty());
vbox.prefHeightProperty().bind(scene.heightProperty());
table.prefHeightProperty().bind(vbox.heightProperty());
((Group) scene.getRoot()).getChildren().addAll(vbox);
stage.setScene(scene);
stage.show();
}
private void generateMenu(MenuBar menuBar, Stage stage) {
// Menu File
Menu menuFile = new Menu("File");
menuBar.getMenus().addAll(menuFile);
// MenuItem Exit
MenuItem open = new MenuItem("Open");
open.setOnAction((ActionEvent t) -> {
FileChooser fileChooser = new FileChooser();
fileChooser.setTitle("Open CSV File");
fileChooser.getExtensionFilters().addAll(
new FileChooser.ExtensionFilter("CSV", "*.csv"),
new FileChooser.ExtensionFilter("All", "*.*")
);
File file = fileChooser.showOpenDialog(stage);
if (file != null) {
readCSV(file);
open.setDisable(true);
}
});
// 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, "UTF-8");
InputStreamReader sr = new InputStreamReader(in, "Shift_JIS");
BufferedReader br = new BufferedReader(sr);
String line;
boolean isHeader = true;
while ((line = br.readLine()) != null) {
StringTokenizer token = new StringTokenizer(line, ",");
ObservableList<String> lineList = FXCollections.observableArrayList();
if (isHeader) {
while (token.hasMoreTokens()) {
headers.add(token.nextToken());
}
isHeader = false;
} else {
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 idx = 0;
TableColumn[] column = new TableColumn[headers.size()];
for (String colName : headers) {
column[idx] = new TableColumn(colName);
column[idx].setCellValueFactory(new SetCellProperty(idx));
idx++;
}
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;
}
private static class SetCellProperty implements Callback<CellDataFeatures<ObservableList, String>, ObservableValue<String>> {
private final int i;
public SetCellProperty(int i) {
this.i = i;
}
@Override
public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {
return new SimpleStringProperty(param.getValue().get(i).toString());
}
}
}
実行例を以下に示しました。郵便番号データダウンロード 住所の郵便番号(ローマ字) zip形式 - 日本郵便 からダウンロードした CSV ファイルにヘッダー情報をつけるなどの加工をしておいて読み込んでみました。
参考サイト


0 件のコメント:
コメントを投稿