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] からソースコードを入手できるようにしています。
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-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 になりそうです。
0 件のコメント:
コメントを投稿