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 件のコメント:
コメントを投稿