how example descargar application javafx-2 javafx

javafx 2 - example - columna javafx en el tamaño de ajuste automático de la tabla



javafx netbeans (9)

Creo que solo anulando una función de devolución de llamada que devuelve verdadero se resolverá el problema, se desactivará el redimensionamiento de las columnas y se redimensionarán todas las columnas para que se ajusten al contenido de sus celdas.

Ejemplo:

TableView<String[]> table = new TableView<>(); table.setColumnResizePolicy(new Callback<TableView.ResizeFeatures, Boolean>() { @Override public Boolean call(ResizeFeatures p) { return true; } });

afaik TableView en javafx tiene 2 políticas de cambio de tamaño de columna: CONSTRAINED_RESIZE_POLICY y UNCONSTRAINED_RESIZE_POLICY, pero quiero que las columnas cambien de tamaño para ajustarse al contenido de las celdas Creo que es un problema simple en otra plataforma (como datagridview en C #) pero no puede resolver


Después de 3 años vuelvo a este problema de nuevo, algunas sugerencias son calcular el tamaño del texto de los datos en cada celda (es complicado según el tamaño de la fuente, la familia de fuentes, el relleno ...)

Pero me doy cuenta de que cuando hago clic en el divisor en el encabezado de la tabla, se adapta al contenido según lo que quiero. Así que exploro el código fuente de JavaFX Finalmente encontré el método resizeColumnToFitContent en TableViewSkin , pero es un método protegido , podemos resolverlo por reflexión:

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

Tenga en cuenta que llamamos a " tableView.getItems () ", así que debemos llamar a esta función después de setItems ()


Después de probar las soluciones anteriores, finalmente encontré una que funcionó para mí. Así que aquí está el mío (llama al método después de insertar los datos en la tabla):

public static void autoResizeColumns( TableView<?> table ) { //Set the right policy table.setColumnResizePolicy( TableView.UNCONSTRAINED_RESIZE_POLICY); table.getColumns().stream().forEach( (column) -> { //Minimal width = columnheader Text t = new Text( column.getText() ); double max = t.getLayoutBounds().getWidth(); for ( int i = 0; i < table.getItems().size(); i++ ) { //cell must not be empty if ( column.getCellData( i ) != null ) { t = new Text( column.getCellData( i ).toString() ); double calcwidth = t.getLayoutBounds().getWidth(); //remember new max-width if ( calcwidth > max ) { max = calcwidth; } } } //set the new max-widht with some extra space column.setPrefWidth( max + 10.0d ); } ); }


Después de una larga investigación. La mejor solución es ...

tblPlan.setColumnResizePolicy((param) -> true ); Platform.runLater(() -> customResize(tblPlan));

"Tamaño personalizado"

public void customResize(TableView<?> view) { AtomicLong width = new AtomicLong(); view.getColumns().forEach(col -> { width.addAndGet((long) col.getWidth()); }); double tableWidth = view.getWidth(); if (tableWidth > width.get()) { view.getColumns().forEach(col -> { col.setPrefWidth(col.getWidth()+((tableWidth-width.get())/view.getColumns().size())); }); } }


Este código aumenta todos los anchos de columna en proporciones relacionales para el ancho de la tabla,
mientras que puede fijar el ancho de la primera columna a un valor dado cuando el ancho de la tabla es menor que x

// To generalize the columns width proportions in relation to the table width, // you do not need to put pixel related values, you can use small float numbers if you wish, // because it''s the relative proportion of each columns width what matters here: final float[] widths = { 1.2f, 2f, 0.8f };// define the relational width of each column // whether the first column should be fixed final boolean fixFirstColumm = true; // fix the first column width when table width is lower than: final float fixOnTableWidth = 360; //pixels // calulates sum of widths float sum = 0; for (double i : widths) { sum += i; } // calculates the fraction of the first column proportion in relation to the sum of all column proportions float firstColumnProportion = widths[0] / sum; // calculate the fitting fix width for the first column, you can change it by your needs, but it jumps to this width final float firstColumnFixSize = fixOnTableWidth * firstColumnProportion; // set the width to the columns for (int i = 0; i < widths.length; i++) { table.getColumns().get(i).prefWidthProperty().bind(table.widthProperty().multiply((widths[i] / sum))); // ---------The exact width-------------^-------------^ if (fixFirstColumm) if (i == 0) { table.widthProperty().addListener(new ChangeListener<Number>() { @Override public void changed(ObservableValue<? extends Number> arg0, Number oldTableWidth, Number newTableWidth) { if (newTableWidth.intValue() <= fixOnTableWidth) { // before you can set new value to column width property, need to unbind the autoresize binding table.getColumns().get(0).prefWidthProperty().unbind(); table.getColumns().get(0).prefWidthProperty().setValue(firstColumnFixSize); } else if (!table.getColumns().get(0).prefWidthProperty().isBound()) { // than readd the autoresize binding if condition table.width > x table.getColumns().get(0).prefWidthProperty() .bind(table.widthProperty().multiply(firstColumnProportion)); } } }); } }

consejos para poner el código en una clase TableAutoresizeModel separada, allí puede manejar más cálculos, por ejemplo, en ocultar columnas agregar oyente ...


He usado las otras soluciones en esta pregunta, y funciona bastante bien. Sin embargo, la desventaja de esto es cuando el ancho del TableView es mayor que el ancho requerido de TableColumns. Creé un truco para resolver este problema, y ​​funciona bien:

orderOverview.setColumnResizePolicy((param) -> true ); Platform.runLater(() -> FXUtils.customResize(orderOverview));

donde FXUtils.customResize () se crea de la siguiente manera:

public static void customResize(TableView<?> view) { AtomicDouble width = new AtomicDouble(); view.getColumns().forEach(col -> { width.addAndGet(col.getWidth()); }); double tableWidth = view.getWidth(); if (tableWidth > width.get()) { TableColumn<?, ?> col = view.getColumns().get(view.getColumns().size()-1); col.setPrefWidth(col.getWidth()+(tableWidth-width.get())); } }

¡Espero que esto también pueda ser útil para otras personas!


O para hacerlo breve:

// automatically adjust width of columns depending on their content configAttributeTreeTable.setColumnResizePolicy((param) -> true );


Si desea que solo una columna ocupe el ancho restante de una tabla, he encontrado una solución bastante sencilla, que es corta y no requiere la solución de reflexión hacky descrita anteriormente:

DoubleBinding usedWidth = columnA.widthProperty().add(columnB.widthProperty()).add(columnC.widthProperty()); fillingColumn.prefWidthProperty().bind(tableView.widthProperty().subtract(usedWidth));


public static void autoFillColumn(TableView<?> table, int col) { double width = 0; for (int i = 0; i < table.getColumns().size(); i++) { if (i != col) { width += table.getColumns().get(i).getWidth(); } } table.getColumns().get(col).setPrefWidth(table.getWidth() - width); }