import java.io.File;
import java.net.MalformedURLException;
import java.util.List;

import javafx.application.Application;
import javafx.beans.property.ReadOnlyObjectWrapper;
import javafx.collections.FXCollections;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

public class Test extends Application {


    private static class Foo {
      private final String a;
      private final int b;
      private final int c;
      private final int d;
      private final int e;
      private final int f;
      private final int g;
      private final int h;

      public Foo(String a, int b, int c, int d, int e, int f, int g, int h) {
          this.a = a;
          this.b = b;
          this.c = c;
          this.d = d;
          this.e = e;
          this.f = f;
          this.g = g;
          this.h = h;
      }
  }

  private TableView<Foo> table = new TableView<>(FXCollections.observableList(
          List.of(new Foo("A", 1, 2, 3, 4, 5, 6, 7),
                  new Foo("AA", 10, 20, 30, 40, 50, 60, 70),
                  new Foo("AAA", 100, 200, 300, 400, 500, 600, 700))));

  public static void main(String[] args) {
      launch(args);
  }

  @Override
  public void start(Stage primaryStage) throws MalformedURLException {
      Application.setUserAgentStylesheet(new File("test.css").toURI().toURL().toString());
      var aColumn = new TableColumn<Foo, String>("A");
      aColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().a));
      aColumn.setResizable(true);

      var bColumn = new TableColumn<Foo, Integer>("B");
      bColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().b));
      bColumn.setResizable(true);

      var cColumn = new TableColumn<Foo, Integer>("C");
      cColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().c));
      cColumn.setResizable(true);

      var dColumn = new TableColumn<Foo, Integer>("D");
      dColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().d));
      dColumn.setResizable(true);

      var eColumn = new TableColumn<Foo, Integer>("E");
      eColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().e));
      eColumn.setResizable(true);

      var fColumn = new TableColumn<Foo, Integer>("F");
      fColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().f));
      fColumn.setResizable(true);

      var gColumn = new TableColumn<Foo, Integer>("G");
      gColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().g));
      gColumn.setResizable(true);

      var hColumn = new TableColumn<Foo, Integer>("H");
      hColumn.setCellValueFactory((data) -> new ReadOnlyObjectWrapper<>(data.getValue().h));
      hColumn.setResizable(true);

      table.getColumns().addAll(aColumn, bColumn, cColumn, dColumn, eColumn, fColumn, gColumn, hColumn);
      table.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY_FLEX_LAST_COLUMN);//LINE X

      VBox.setVgrow(table, Priority.ALWAYS);

      VBox root = new VBox(new TextField(), table);
      var scene = new Scene(root, 400, 300);
      primaryStage.setScene(scene);
      primaryStage.show();
  }
}