package treetable; import com.sun.javafx.runtime.VersionInfo; import javafx.application.Application; import javafx.beans.property.SimpleStringProperty; import javafx.beans.value.ChangeListener; import javafx.beans.value.ObservableValue; import javafx.collections.FXCollections; import javafx.collections.ObservableList; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.*; import javafx.scene.control.TreeTableColumn.CellDataFeatures; import javafx.scene.control.cell.TextFieldTreeTableCell; import javafx.scene.layout.HBox; import javafx.stage.Stage; import javafx.util.Callback; import java.util.ArrayList; public class TreeTableApp2 extends Application { public static final int DATA_FIELDS_NUM = 5; public static final int DATA_ITEMS_NUM = 17; private ObservableList idPool = FXCollections.observableArrayList(); private TreeTableView ttv; private TreeTableColumn name; private ObservableList> data; @Override public void start(Stage primaryStage) { HBox root = new HBox(10.0); Scene scene = new Scene(root, 500, 500); initTreeTableView(); root.getChildren().add(ttv); Button showSelection = new Button("Show selection"); showSelection.setOnAction(new EventHandler() { @Override public void handle(ActionEvent actionEvent) { for(Object o : ttv.getSelectionModel().getSelectedCells().sorted((Object x, Object y) -> { return ((TreeTablePosition) x).getRow() - ((TreeTablePosition) y).getRow(); })) { TreeTablePosition pos = (TreeTablePosition) o; System.out.println(pos.getRow()); } System.out.println(); } }); root.getChildren().add(showSelection); Button showFocus = new Button("Show focus"); showFocus.setOnAction(new EventHandler() { @Override public void handle(ActionEvent actionEvent) { System.out.println("focus: " + ttv.getFocusModel().getFocusedCell().getRow()); } }); root.getChildren().add(showFocus); primaryStage.setTitle(VersionInfo.getRuntimeVersion()); primaryStage.setScene(scene); primaryStage.show(); } public static void main(String[] args) { launch(args); } private void initTreeTableView() { ttv = new TreeTableView(); ttv.setShowRoot(false); ttv.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); ttv = new TreeTableView(); ttv.setRoot(new TreeItem(new Data("fictive", 50, 10))); ttv.getRoot().setExpanded(true); ttv.setMinSize(410, 410); ttv.setMaxSize(410, 410); ttv.setPrefSize(410, 410); reset(DATA_ITEMS_NUM - 1, DATA_FIELDS_NUM, 0); } void reset(int rows, int columns, int length) { TreeItem root = new TreeItem(new Data("fictive", columns, 10)); root.setExpanded(true); ttv.setRoot(root); data = ttv.getRoot().getChildren(); fill(rows, columns, length); } void fill(int rowsNum, int columnsNum, int length) { data.clear(); for (int i = 0; i < rowsNum; i++) { data.add(new TreeItem(new Data(String.format("%02d", i), columnsNum, length))); } ttv.getColumns().clear(); final ContextMenu contextMenu = new ContextMenu(); for (int i = 0; i < columnsNum; i++) { ttv.getColumns().add(createColumn(i, contextMenu)); } ttv.setContextMenu(contextMenu); } TreeTableColumn createColumn(final int index, final ContextMenu contextMenu) { final TreeTableColumn field = new TreeTableColumn("field " + index); final CheckMenuItem visible = new CheckMenuItem("field " + index); visible.setSelected(field.isVisible()); visible.selectedProperty().addListener(new ChangeListener() { public void changed(ObservableValue ov, Boolean t, Boolean t1) { field.setVisible(t1); } }); contextMenu.getItems().add(visible); final ContextMenu columnContextMenu = new ContextMenu(); field.setContextMenu(columnContextMenu); CheckMenuItem sortable = new CheckMenuItem("Sortable"); sortable.setSelected(field.isSortable()); sortable.selectedProperty().addListener(new ChangeListener() { public void changed(ObservableValue ov, Boolean t, Boolean t1) { field.setSortable(t1); } }); columnContextMenu.getItems().add(sortable); final MenuItem removeColumn = new MenuItem("Remove column"); removeColumn.setOnAction(new EventHandler() { public void handle(ActionEvent t) { ttv.getColumns().remove(field); contextMenu.getItems().remove(visible); } }); columnContextMenu.getItems().add(removeColumn); field.setCellValueFactory(new Callback, ObservableValue>() { public ObservableValue call(TreeTableColumn.CellDataFeatures p) { return ((Data) ((TreeItem) p.getValue()).getValue()).data.get(index); } }); return field; } public static class Data { protected String name; protected ArrayList data; public Data(String name, int fieldsNum, int length) { this.name = name; data = new ArrayList(fieldsNum); for (int i = 0; i < fieldsNum; i++) { data.add(new SimpleStringProperty("item " + name + " field " + i + getLongItem(length))); } } public String getName() { return name; } protected String getLongItem(int length) { if (length == 0) { return ""; } String str = " l"; for (int i = 0; i < length; i++) { str += "o"; } return str + "ng"; } } }