JavaFX 2 Automatyczna Szerokość Kolumny

Mam tabelę JavaFX 2, która wyświetla dane kontaktowe osób, wyobraźmy sobie, że są trzy kolumny: imię, nazwisko i adres e-mail. Po uruchomieniu aplikacji zapełnia tabelę kilkoma wierszami danych o osobach już w systemie.

Problem polega na tym, że wszystkie szerokości kolumn są takie same. Przez większość czasu imię i nazwisko jest wyświetlane w całości, ale adres e-mail jest wycinany. Użytkownik może dwukrotnie kliknąć dzielnik w nagłówku aby zmienić rozmiar kolumny, ale to szybko stanie się nudne.

Gdy tabela zostanie wstępnie wypełniona, chciałbym programowo zmienić rozmiar wszystkich kolumn, aby wyświetlić dane, które zawierają, ale nie mogę dowiedzieć się, jak to osiągnąć. Widzę, że mogę zadzwonić col.setPrefWidth(x), ale to nie pomaga, bo musiałbym odgadnąć szerokość.

 40
Author: wobblycogs, 2012-04-14

8 answers

Jeśli całkowita liczba kolumn jest wcześniej znana. Szerokość kolumn można rozdzielić między szerokość widoku tableview:

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

W tym kodzie proporcje szerokości kolumn są zsynchronizowane podczas zmiany rozmiaru tableview, więc nie musisz tego robić ręcznie. Również surnameCol zajmuje połowę szerokości widoku tabeli.

 64
Author: Uluk Biy,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-17 14:19:08

To działa dla mnie w 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

W innych przykładach masz problem, szerokość pionowego paska przewijania jest ignorowana.

 11
Author: Rene Kiupel,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-08 08:47:35

Po 3 latach wreszcie znalazłem rozwiązanie, kolumna javafx w tableview auto fit size

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();
                    }
                }
            }
        });
    }
}
 3
Author: yelliver,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-05-23 12:18:18

Gdy używam Scenebuidera, po prostu definiuję MinWidth i MaxWidth do niektórych kolumn, a do kolumny głównej po prostu definiuję PrefWidth na "USE_COMPUTED_SIZE"

 2
Author: Rubens,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-02-18 11:38:29

Jeśli masz 4 kolumny i tylko ostatnią kolumnę potrzebną do rozwinięcia, aby wypełnić resztę szerokości tabeli, a pozostałe kolumny pozostały rozmiarem ustawionym w Kreatorze scen.

double width = col1.widthProperty().get();
width += col2.widthProperty().get();
width += col3.widthProperty().get();

col4.prefWidthProperty().bind(table.widthProperty().subtract(width));

Lub jeśli masz 2 kolumny, które trzeba rozwinąć następnie.

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));
 1
Author: Kelly Wiles,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-08-12 12:37:47

Możesz to również zrobić, edytując plik fxml, jeśli go posiadasz.

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

Parametr prefWidth pozwala na modyfikację domyślnej kolumny with.

 0
Author: lmiguelvargasf,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2016-07-07 01:20:05

Aby wygenerować szerokość i użyć dowolnej liczby i upewnić się, że szerokość jest 100% szerokości tabeli, możesz użyć :

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-------------^-------------^
}
 0
Author: YCF_L,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2017-06-24 11:56:22

Również bardzo prosty trik oparty na AnchorPane będzie dobrym rozwiązaniem.

Owijamy {[3] } w AnchorPane, ale również zakotwiczymy lewą i prawą stronę TableView w następujący sposób:

AnchorPane wrapper = new AnchorPane();

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

Ten prosty kod rozciągnie TableView w obu kierunkach (w prawo i w lewo), dostosuje się również po dodaniu paska przewijania.

Możesz dowiedzieć się, jak to działa, oglądając ten animowany gif.

Tutaj wpisz opis obrazka

Teraz możesz zmienić rozmiar kolumn, dodawanie tych wierszy:

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
 0
Author: Teocci,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/doraprojects.net/template/agent.layouts/content.php on line 54
2018-07-13 09:34:28