public void updateWidth(double dx) {

    // Clamp x2 + dx in [x1, x3]
    final double newX2 = Math.max(x1, Math.min(x3, x2 + dx));
    final double newWidth = newX2 - x1;
    final double newWidthNext = x3 - newX2;

    //        assert (newCellWidth+newNextWidth) ==
    // (downColWidths[colIndex]+downColWidths[colIndex+1]) :
    //                "newCellWidth+newNextWidth=" +  (newCellWidth+newNextWidth) + ", " +
    //                "downColWidths[colIndex]+downColWidths[colIndex+1]=" +
    //                (downColWidths[colIndex]+downColWidths[colIndex+1]);

    // Updates width of treeTableColumn
    treeTableColumn.setPrefWidth(newWidth);
    if (treeTableColumn.getMinWidth() == Region.USE_COMPUTED_SIZE) {
      treeTableColumn.setMinWidth(newWidth);
    } else {
      treeTableColumn.setMinWidth(Math.min(newWidth, treeTableColumn.getMinWidth()));
    }
    if (treeTableColumn.getMaxWidth() == Region.USE_COMPUTED_SIZE) {
      treeTableColumn.setMaxWidth(newWidth);
    } else {
      treeTableColumn.setMaxWidth(Math.max(newWidth, treeTableColumn.getMaxWidth()));
    }

    // Updates with of treeTableColumnNext
    if (treeTableColumnNext != null) {
      treeTableColumnNext.setPrefWidth(newWidthNext);
      if (treeTableColumnNext.getMinWidth() == Region.USE_COMPUTED_SIZE) {
        treeTableColumnNext.setMinWidth(newWidthNext);
      } else {
        treeTableColumnNext.setMinWidth(Math.min(newWidthNext, treeTableColumnNext.getMinWidth()));
      }
      if (treeTableColumnNext.getMaxWidth() == Region.USE_COMPUTED_SIZE) {
        treeTableColumnNext.setMaxWidth(newWidthNext);
      } else {
        treeTableColumnNext.setMaxWidth(Math.max(newWidthNext, treeTableColumnNext.getMaxWidth()));
      }
    }
  }
 public void applyTo(TreeTableColumn<?, ?> tc) {
   tc.setMinWidth(minWidth);
   tc.setMaxWidth(maxWidth);
   tc.setPrefWidth(prefWidth);
 }