2016-02-10

ControlsFX の SpreadsheetView クラスを試す

ControlsFX 1.は 高品質な UI やその他のツールを提供することで、JavaFX に足りない機能を補完することを目的としたオープンソースのプロジェクトです(修正 BSD ライセンス)。たとえば JDK 8u40 のリリース (2015/3/3) より前は、ダイアログを簡単に作成するクラスが同梱されている JavaFX で提供されていませんでしたが、ControlFX がそこを補っていました。

JavaFX に簡単にダイアログを作成するクラスがなかった頃に ControlsFX を知りましたが、その当時はなぜかあまり興味を持ちませんでした。しかし、よく見ると、いろいろ面白そうな UI が揃っています。今回はその中から、SpreadsheetView クラスのサンプルを紹介します。

動作を確認した環境は次の通りです。

  • OS: Fedora 23 (x86_64)
  • Java: Java SE 1.8.0_72 (jdk1.8.0_72-1.8.0_72-fcs.x86_64)
  • ControlsFX 8.40.10 (controlsfx-8.40.10.jar)
  • IDE: NetBeans IDE 8.1

デモプログラム

ControlsFX をダウンロードして展開すると、サンプルプログラム controlsfx-samples-8.40.10.jar が同梱されていますので、まずはこのプログラムを紹介します。

$ ls
controlsfx-8.40.10.jar          fxsampler-1.0.9.jar
controlsfx-samples-8.40.10.jar  license.txt
$ /usr/java/latest/bin/java -jar controlsfx-samples-8.40.10.jar
Initialising FXSampler sample scanner...
 Discovering projects...
  Found project 'ControlsFX', with sample base package 'org.controlsfx.samples'

このサンプルでは、各コントロールなどの実行例、ソース、JavaDoc のマニュアルを見ることができます。

SpreadsheetView クラス

ControlFX の JavaDocs の Class SpreadsheetView 2. に掲載されているコードサンプルをベースにして、簡単なサンプルを作りました。今後、機能を追加して、シンプルなスプレッドシートのアプリケーションにまで改良を重ねていきたいので、名前を SpreadSheet として、単なるサンプル扱いにはしていません。参考サイト [3] からソースコードを入手できるようにしています。

リスト:SpreadSheet.java 
package spreadsheet;

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.layout.StackPane;
import javafx.stage.Stage;
import org.controlsfx.control.spreadsheet.GridBase;
import org.controlsfx.control.spreadsheet.SpreadsheetCell;
import org.controlsfx.control.spreadsheet.SpreadsheetCellType;
import org.controlsfx.control.spreadsheet.SpreadsheetView;

public class SpreadSheet extends Application {

    double defaultWidth = 60;

    @Override
    public void start(Stage stage) {
        int rowCount = 100;
        int columnCount = 100;
        GridBase grid = new GridBase(rowCount, columnCount);

        ObservableList<ObservableList<SpreadsheetCell>> rows = FXCollections.observableArrayList();
        for (int row = 0; row < grid.getRowCount(); row++) {
            final ObservableList<SpreadsheetCell> list = FXCollections.observableArrayList();
            for (int col = 0; col < grid.getColumnCount(); col++) {
                SpreadsheetCell cell = SpreadsheetCellType.STRING.createCell(row, col, 1, 1, (String) null);
                list.add(cell);
            }
            rows.add(list);
        }
        grid.setRows(rows);

        SpreadsheetView sheet = new SpreadsheetView(grid);
        sheet.getColumns().stream().filter((column) -> (column.isColumnFixable())).forEach((column) -> {
            column.setPrefWidth(defaultWidth);
        });

        StackPane root = new StackPane();
        root.getChildren().add(sheet);

        Scene scene = new Scene(root, 400, 400);
        stage.setTitle(getClass().getSimpleName());
        stage.setScene(scene);
        scene.getStylesheets().add(getClass().getResource(getClass().getSimpleName() + ".css").toExternalForm());
        stage.show();
    }

    public static void main(String[] args) {
        launch(args);
    }
}
リスト:SpreadSheet.css 
.spreadsheet-cell {
    -fx-border-color: gray;
    -fx-border-insets: 0;
    -fx-border-width: 0.2;
    -fx-border-style: dashed;
}

.spreadsheet-cell:selected {
    -fx-background-color: #ddd;
}

.spreadsheet-cell:hover {
    -fx-background-color: #ccf;
}

実行例

スプレッドシートと言えば Microsoft Office の Excel が思い付きますが、そんなに高機能でなくても、ちょっとしたデータの表示や操作にスプレッドシート状の UI を使いたい時が結構あります。この SpreadsheetView クラスは、基本的なコピーペーストなどの機能が既に実装されていますので、自分にとっては手軽に、しかもかなり使い甲斐がありそうなコントロール UI になりそうです。

参考サイト

  1. ControlsFX // JavaFX News, Demos and Insight // FX Experience
  2. SpreadsheetView (ControlsFX Project 8.40.10)
  3. bitwalk123/SpreadSheet

0 件のコメント: