example descargar javafx-2

javafx-2 - descargar - javafx netbeans



Ancho Automático De La Columna De JavaFX 2 (8)

Además, un truco muy simple basado en un AnchorPane será una buena solución.

Vamos a envolver el TableView en un AnchorPane pero también vamos a anclar el lado izquierdo y derecho del TableView esta manera:

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

Este código simple también estirará el TableView en ambas direcciones (derecha e izquierda), se ajustará cada vez que se agregue la barra de desplazamiento.

Puedes tener una idea de cómo funciona esto viendo este gif animado.

Ahora puedes cambiar el tamaño de las columnas, agregando estas líneas:

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

Tengo una tabla JavaFX 2 que muestra los detalles de contacto de las personas, imaginemos que hay tres columnas: nombre, apellido y dirección de correo electrónico. Cuando mi aplicación se inicia, llena la tabla con varias filas de datos sobre las personas que ya están en el sistema.

El problema es que los anchos de columna son todos iguales. La mayoría de las veces, el nombre y el apellido se muestran completos, pero la dirección de correo electrónico se recorta. El usuario puede hacer doble clic en el divisor en el encabezado para cambiar el tamaño de la columna, pero eso se volverá tedioso rápidamente.

Una vez que la tabla se haya completado previamente, me gustaría cambiar el tamaño de todas las columnas de manera programática para mostrar los datos que contienen, pero no puedo averiguar cómo lograrlo. Puedo ver que puedo llamar a col.setPrefWidth(x) pero eso no ayuda realmente ya que tendría que adivinar el ancho.


Después de 3 años, finalmente encontré la solución, javafx column in 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(); } } } }); } }


Esto me funciona en 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

En los otros ejemplos que tiene el problema, el ancho de la barra de desplazamiento vertical se ignora.


Mientras uso SceneBuider, simplemente defino el MinWidth y MaxWidth para algunas columnas y para la columna principal, simplemente defino el PrefWidth para "USE_COMPUTED_SIZE"


Para generar el ancho y usar cualquier número y asegurarte de que el ancho sea el 100% del ancho de la tabla, puedes usar:

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-------------^-------------^ }


Si su número total de columnas es pre-conocido. Puede distribuir los anchos de columna entre el ancho de la vista de tabla:

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

En este código, las proporciones de ancho de las columnas se mantienen sincronizadas cuando se cambia el tamaño de la vista de tabla, por lo que no es necesario hacerlo manualmente. También surnameCol ocupa la mitad de espacio del ancho de la vista de tabla.


Si tenía 4 columnas y solo la última columna necesitaba expandirse para completar el resto del ancho de la tabla y las demás columnas seguían siendo del tamaño que configuré en el Generador de escenas.

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

O si tuvieras 2 columnas que necesitabas expandir entonces.

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


También puedes hacerlo editando el archivo fxml si tienes uno.

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

El parámetro prefWidth permite modificar el valor predeterminado de una columna.