Подтвердить что ты не робот

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

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

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

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

4b9b3361

Ответ 1

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

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

Ответ 2

В дополнение к ответу Улука использование widthProperty().multiply(x) вместо widthProperty().divide(x) выглядит более удобным и точным для меня.

nameCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.25));
surnameCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.50));
emailCol.prefWidthProperty().bind(personTable.widthProperty().multiply(0.25));

Ответ 3

Это работает для меня в 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

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

Ответ 4

Спустя 3 года, наконец, я нашел решение, столбец javafx в формате автоматической установки таблицыview

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();
                    }
                }
            }
        });
    }
}

Ответ 5

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

Ответ 6

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

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

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

Ответ 7

Если у вас было 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));

Ответ 8

Чтобы генерировать ширину и использовать любое число и убедиться, что ширина составляет 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-------------^-------------^
}