package javaapplication10; import com.sun.javafx.scene.control.skin.NestedTableColumnHeader; import com.sun.javafx.scene.control.skin.TableColumnHeader; import com.sun.javafx.scene.control.skin.TableHeaderRow; import com.sun.javafx.scene.control.skin.TableViewSkin; import javafx.application.Application; import javafx.event.ActionEvent; import javafx.event.EventHandler; import javafx.scene.Scene; import javafx.scene.control.Button; import javafx.scene.control.TableColumnBase; import javafx.scene.control.TableView; import javafx.scene.layout.VBox; import javafx.stage.Stage; public class TableViewApp extends Application { public final static String CUSTOM_IMPLEMENTATION_MARKER = "CUSTOM_IMPLEMENTATION_MARKER"; public static void main(String[] args) { launch(args); } @Override public void start(Stage stage) throws Exception { final TableView tv = new TableView(); Button b = new Button("Press me"); b.setOnAction(new EventHandler() { @Override public void handle(ActionEvent t) { tv.setSkin(new TableViewSkin(tv) { @Override public String toString() { return "CUSTOM " + super.toString(); } @Override protected TableHeaderRow createTableHeaderRow() { return new TableHeaderRow(this) { @Override protected NestedTableColumnHeader createRootHeader() { return new NestedTableColumnHeader((TableViewSkin) tv.getSkin(), null) { @Override protected TableColumnHeader createTableColumnHeader(TableColumnBase col) { if (col.getColumns().isEmpty()) { final TableColumnHeader tableColumnHeader = new TableColumnHeader(getTableViewSkin(), col); tableColumnHeader.setId(CUSTOM_IMPLEMENTATION_MARKER); return tableColumnHeader; } else { final NestedTableColumnHeader nestedTableColumnHeader = new NestedTableColumnHeader(getTableViewSkin(), col); nestedTableColumnHeader.setId(CUSTOM_IMPLEMENTATION_MARKER); return nestedTableColumnHeader; } } }; } }; } }); } }); Scene scene = new Scene(new VBox(tv, b), 300, 300); stage.setScene(scene); stage.show(); } }