Автоматическая ширина столбца JavaFX 2

У меня есть таблица JavaFX 2, в которой отображаются контактные данные для людей. Представьте себе, что существует три столбца: имя, фамилия и адрес электронной почты. Когда мое приложение запускается, он заполняет таблицу несколькими строками данных о людях, которые уже находятся в системе.

Проблема в том, что ширина столбцов одинакова. Большую часть времени имя и фамилия отображаются полностью, но адрес электронной почты становится обрезанным. Пользователь может дважды щелкнуть разделитель в заголовке, чтобы resize столбца, но это будет утомительно быстро.

После того, как таблица была предварительно заполнена, я хотел бы программно resize всех столбцов, чтобы отобразить данные, которые они содержат, но я не могу понять, как это сделать. Я вижу, что я могу вызвать col.setPrefWidth(x) но это действительно не помогает, поскольку мне нужно угадать ширину.

Если общее количество столбцов предварительно известно. Ширину столбцов можно распределить по ширине таблицы:

 nameCol.prefWidthProperty().bind(personTable.widthProperty().divide(4)); // w * 1/4 surnameCol.prefWidthProperty().bind(personTable.widthProperty().divide(2)); // w * 1/2 emailCol.prefWidthProperty().bind(personTable.widthProperty().divide(4)); // w * 1/4 

В этом коде пропорции ширины столбцов сохраняются в синхронизации при изменении размера таблицы, поэтому вам не нужно делать это вручную. Также surnameCol занимает половину ширины surnameCol .

Это работает для меня в JavaFX 8

 table.setColumnResizePolicy( TableView.CONSTRAINED_RESIZE_POLICY ); col1.setMaxWidth( 1f * Integer.MAX_VALUE * 50 ); // 50% width col2.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width col3.setMaxWidth( 1f * Integer.MAX_VALUE * 20 ); // 20% width 

В других примерах у вас есть проблема, ширина вертикальной полосы прокрутки игнорируется.

Через 3 года, наконец, я нашел решение, столбец javafx в формате таблицы соответствия

 import com.sun.javafx.scene.control.skin.TableViewSkin; import javafx.scene.control.Skin; import javafx.scene.control.TableColumn; import javafx.scene.control.TableView; import java.lang.reflect.InvocationTargetException; import java.lang.reflect.Method; public class GUIUtils { private static Method columnToFitMethod; static { try { columnToFitMethod = TableViewSkin.class.getDeclaredMethod("resizeColumnToFitContent", TableColumn.class, int.class); columnToFitMethod.setAccessible(true); } catch (NoSuchMethodException e) { e.printStackTrace(); } } public static void autoFitTable(TableView tableView) { tableView.getItems().addListener(new ListChangeListener() { @Override public void onChanged(Change c) { for (Object column : tableView.getColumns()) { try { columnToFitMethod.invoke(tableView.getSkin(), column, -1); } catch (IllegalAccessException | InvocationTargetException e) { e.printStackTrace(); } } } }); } } 

Поскольку я использую SceneBuider, я просто определяю MinWidth и MaxWidth для некоторых столбцов, а для основного столбца я просто определяю PrefWidth для “USE_COMPUTED_SIZE”

Если у вас было 4 столбца и только последний столбец, необходимый для расширения, чтобы заполнить остальную ширину таблицы, а остальные столбцы остались теми размерами, которые я установил в Scene Builder.

 double width = col1.widthProperty().get(); width += col2.widthProperty().get(); width += col3.widthProperty().get(); col4.prefWidthProperty().bind(table.widthProperty().subtract(width)); 

Или если у вас было 2 столбца, которые нужно было расширять.

 double width = col1.widthProperty().get(); width += col3.widthProperty().get(); col2.prefWidthProperty().bind(table.widthProperty().subtract(width).divide(2)); col4.prefWidthProperty().bind(table.widthProperty().subtract(width).divide(2)); 

Вы также можете сделать это, отредактировав файл fxml, если он у вас есть.

  

Параметр prefWidth позволяет изменять значение по умолчанию столбца.

Чтобы генерировать ширину и использовать любое число и убедиться, что ширина составляет 100% от ширины таблицы, вы можете использовать:

 double[] widths = {20, 30, 50, 20, 30, 70, 50};//define the width of the columns //calculate the sum of the width double sum = 0; for (double i : widths) { sum += i; } //set the width to the columns for (int i = 0; i < widths.length; i++) { table.getColumns().get(i).prefWidthProperty().bind( table.widthProperty().multiply(sizes[i] / sum)); //---------The exact width-------------^-------------^ } 

Кроме того, очень простой трюк, основанный на AnchorPane будет хорошим решением.

Мы собираемся обернуть TableView в AnchorPane но также мы будем привязывать левую и правую сторону TableView следующим образом:

 AnchorPane wrapper = new AnchorPane(); AnchorPane.setRightAnchor(table, 10.0); AnchorPane.setLeftAnchor(table, 10.0); wrapper.getChildren().add(table); 

Этот простой код будет растягивать TableView в обоих направлениях (вправо и влево) также, он будет настраиваться при каждом добавлении полосы прокрутки.

Вы можете понять, как это работает, наблюдая за этим анимированным gif.

введите описание изображения здесь

Теперь вы можете resize столбцов, добавив следующие строки:

 fnColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width lnColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 40 ); // 40% width emColumn.setMaxWidth( 1f * Integer.MAX_VALUE * 30 ); // 30% width 
  • JavaFX: «Инструментарий» не инициализируется при попытке воспроизведения mp3-файла с помощью classа MediaPlayer
  • Действительная подпись JAR для проектов JavaFX
  • Как написать текст по кривой Безье?
  • JavaFX - setVisible не «скрывает» элемент
  • Почему я получаю java.lang.IllegalStateException «Не в streamе приложения FX» на JavaFX?
  • JavaFX запускает другое приложение
  • Несколько FXML с controllerами, общий объект
  • Настройка cookie с помощью WebEngine / WebView JavaFX
  • Как рассчитать ширину пикселя строки в JavaFX?
  • Доступ к classу controllerа FXML
  • Как обновить поле метки каждые 2 секунды в java fx?
  • Давайте будем гением компьютера.