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

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

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

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

Ответы на вопрос(8)

Решение Вопроса

делить ширину столбцов по ширине таблицы:

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 занимает половину пространства ширины таблицы.

 17 авг. 2018 г., 15:58
Моя упрощенная версия:nameCol.prefWidthProperty().bind(personTable.widthProperty().divide(100/40)); 40% табл.

и только последний столбец необходимо было развернуть, чтобы заполнить остальную часть ширины таблицы, а остальные столбцы остались размером, который я установил в 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));

что ширина равна 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-------------^-------------^
}

Столбец 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<Object>() {
            @Override
            public void onChanged(Change<?> c) {
                for (Object column : tableView.getColumns()) {
                    try {
                        columnToFitMethod.invoke(tableView.getSkin(), column, -1);
                    } catch (IllegalAccessException | InvocationTargetException e) {
                        e.printStackTrace();
                    }
                }
            }
        });
    }
}
 08 янв. 2019 г., 23:55
Он больше не существует, это решение не может быть использовано с более новыми версиями JAVA. Посмотри пожалуйста:stackoverflow.com/questions/50583912/…
 07 янв. 2018 г., 18:36
Я не могу найти или импортировать класс TableViewSkin. Я использую Java 8, и этот класс, по-видимому, не существует.
 09 янв. 2019 г., 04:00
@ MindaugasBernatavi & # x10D; если я давно не занимался разработкой JavaFX, но когда этот метод был удален, можно ли дважды щелкнуть разделитель столбцов для автоматической подгонки, если он есть, мы сможем найти инициированный метод

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

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

 18 февр. 2016 г., 14:34
Где вы видите, что вы можете передать проценты в setMaxWidth?
 31 мар. 2016 г., 00:55
Умный трюк - достаточно большие числа, так что пропорциональный размер должен использоваться, чтобы соответствовать реальному размеру.
 04 нояб. 2018 г., 20:55
Спасибо, используя вашу технику сейчас. Тем не менее я столкнулся с проблемами с шириной вертикальной полосы прокрутки. Когда добавлено достаточное количество элементов, вертикальная полоса прокрутки появилась сразу, это вызвало небольшое смещение между вертикальными строками заголовка и строк TableView. Я смог исправить это, обновив TableView: послеmyTableView.setItems(myObservableList); обновить GUI (графический интерфейс пользователя), открыв Поток приложения с помощью: строка # 1:Platform.runLater(new Runnable() { строка № 2:@Override public void run() { строка № 3:myTableView.refresh(); строка # 4:}});

отредактировав файл fxml, если он у вас есть.

<TableColumn fx:id="blackout_number_column" prefWidth="30.0" text="%number">

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

AnchorPane будет хорошим решением.

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

AnchorPane wrapper = new AnchorPane();

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

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

Вы можете получить представление о том, как это работает, посмотрев этот анимированный GIF.

enter image description here

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

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

я просто определяю MinWidth и MaxWidth для некоторых столбцов, а для основного столбца я просто определяю PrefWidth для & quot; USE_COMPUTED_SIZE & quot;

 24 мар. 2016 г., 09:37
Программная версия этого простоcol.setPrefWidth(Control.USE_COMPUTED_SIZE);

Ваш ответ на вопрос