¿Es posible hacer que la tabla javaFX 2.0 con encabezado de línea múltiple? Todos los ejemplos, que he encontrado en la web, tienen tablas, donde el ancho del encabezado de columna = su tamaño de texto, sin wraping. El exaple de lo que tengo, y lo que necesito se muestra en una pantalla: Tabla de JavaFX 2.0 con encabezado de tabla de varias líneas
Respuesta
me ocurrió la siguiente función:
private void makeHeaderWrappable(TableColumn col) {
Label label = new Label(col.getText());
label.setStyle("-fx-padding: 8px;");
label.setWrapText(true);
label.setAlignment(Pos.CENTER);
label.setTextAlignment(TextAlignment.CENTER);
StackPane stack = new StackPane();
stack.getChildren().add(label);
stack.prefWidthProperty().bind(col.widthProperty().subtract(5));
label.prefWidthProperty().bind(stack.prefWidthProperty());
col.setGraphic(stack);
}
Un ejemplo ejecutable completa es in this gist (requiere la 2.2 developer preview as a minimum).
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.Pane;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.TextAlignment;
import javafx.stage.Stage;
public class TableWrappedHeaders extends Application {
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
TableColumn firstNameCol = new TableColumn("First Name (which is a really long name)");
makeHeaderWrappable(firstNameCol);
firstNameCol.setPrefWidth(100);
firstNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("firstName"));
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setPrefWidth(100);
lastNameCol.setCellValueFactory(new PropertyValueFactory<Person,String>("lastName"));
TableView table = new TableView();
table.getColumns().addAll(firstNameCol, lastNameCol);
table.setItems(FXCollections.observableArrayList(
new Person("Jacob", "Smith"),
new Person("Isabella", "Johnson"),
new Person("Ethan", "Williams")
));
table.setPrefSize(250, 200);
Pane layout = new VBox(10);
layout.setStyle("-fx-padding: 10;");
layout.getChildren().addAll(table);
stage.setScene(new Scene(layout));
stage.show();
}
private void makeHeaderWrappable(TableColumn col) {
Label label = new Label(col.getText());
label.setStyle("-fx-padding: 8px;");
label.setWrapText(true);
label.setAlignment(Pos.CENTER);
label.setTextAlignment(TextAlignment.CENTER);
StackPane stack = new StackPane();
stack.getChildren().add(label);
stack.prefWidthProperty().bind(col.widthProperty().subtract(5));
label.prefWidthProperty().bind(stack.prefWidthProperty());
col.setText(null);
col.setGraphic(stack);
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private Person(String fName, String lName) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
}
public String getFirstName() { return firstName.get(); }
public void setFirstName(String fName) { firstName.set(fName); }
public String getLastName() { return lastName.get(); }
public void setLastName(String fName) { lastName.set(fName); }
}
}
Probablemente haya una mejor manera de hacerlo, pero la función de arriba al menos funcionó para mí en mi caso de prueba.
Pensé que esto sería posible con un estilo de CSS simple, pero no pude hacerlo funcionar solo a través de css.
La forma más fácil de alinear el texto de cabecera es de estilo CSS, así:
.table-view .column-header .label {
-fx-text-alignment: center;
}
Uso secuencia de nueva línea de escape "\ n" en la cadena de texto de cabecera para dividirlo en varias líneas.
es más fácil con una etiqueta en la cabecera gráfica de la columna:
- Añadir una etiqueta en el encabezado de la columna gráfica (si la columna tiene algo de texto como título eliminarlo).
- establecer la etiqueta para permitir Ajustar texto (escena del constructor -> vaya a Propiedades de la etiqueta y seleccione Ajustar texto o de código -> label.setWrapText (verdadero))
- Conjunto ancho de la etiqueta y la altura deseamos
Nota: es más fácil hacer esto en un FXML (con Scene Builder) que en el código.
Ejemplo a continuación:
public class TableColumnLongTextLabel extends Application {
@Override
public void start(Stage stage) {
TableView table = new TableView();
TableColumn tableColumnData1 = new TableColumn(),
tableColumnData2 = new TableColumn("Long Title without Text Wrap");
tableColumnData1.setCellValueFactory(new PropertyValueFactory<SomeStructure, String>("data1"));
tableColumnData2.setCellValueFactory(new PropertyValueFactory<SomeStructure, String>("data2"));
table.getColumns().addAll(tableColumnData1, tableColumnData2);
Label columnTitle = new Label("Long Title with Text Wrapped");
columnTitle.setPrefWidth(125);
columnTitle.setPrefHeight(50);
columnTitle.setWrapText(true);
columnTitle.setTextAlignment(TextAlignment.CENTER);
tableColumnData1.setGraphic(columnTitle);
table.setItems(FXCollections.observableArrayList(
new SomeStructure("Java", "FX", 1),
new SomeStructure("Java", "Swing", 0),
new SomeStructure("Java", "Sample", 2),
new SomeStructure("Some", "Other", 10)
));
Pane layout = new VBox(10);
layout.getChildren().addAll(table);
stage.setScene(new Scene(layout, 350, 350));
stage.show();
}
public static class SomeStructure {
private final SimpleStringProperty data1;
private final SimpleStringProperty data2;
private final SimpleIntegerProperty data3;
private SomeStructure(String data1, String data2, Integer data3) {
this.data1 = new SimpleStringProperty(data1);
this.data2 = new SimpleStringProperty(data2);
this.data3 = new SimpleIntegerProperty(data3);
}
public String getData1() {
return data1.get();
}
public void setData1(String data1) {
this.data1.set(data1);
}
public String getData2() {
return data2.get();
}
public void setData2(String data2) {
this.data2.set(data2);
}
public Integer getData3() {
return data3.get();
}
public void setData3(Integer data3) {
this.data3.set(data3);
}
}
public static void main(String[] args) {
launch(args);
}
}
Ejemplo utilizando FXML (No código necesario :)):
<TableView prefHeight="251.0" prefWidth="556.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1">
<columns>
<TableColumn editable="false" maxWidth="90.0" prefWidth="70.0" sortable="false" text="Player">
<columns>
<TableColumn editable="false" maxWidth="80.0" prefWidth="50.0" text="ID" />
<TableColumn editable="false" maxWidth="200.0" prefWidth="180.0" text="Name" />
</columns>
</TableColumn>
<TableColumn maxWidth="80.0" minWidth="50.0" prefWidth="60.0" text="Game" />
<TableColumn editable="false" maxWidth="160.0" minWidth="125.0" prefWidth="135.0" sortable="false" text="Team" visible="false" />
<TableColumn editable="false" maxWidth="160.0" minWidth="107.0" prefWidth="107.0" sortable="false">
<graphic>
<Label alignment="CENTER" text="Individual Points (Big Team)" textAlignment="CENTER" wrapText="true" />
</graphic>
</TableColumn>
<TableColumn editable="false" maxWidth="160.0" minWidth="99.0" prefWidth="102.0" sortable="false">
<graphic>
<Label alignment="CENTER" text="Team Points (Small Maps)" textAlignment="CENTER" wrapText="true" />
</graphic>
</TableColumn>
<TableColumn editable="false" maxWidth="116.0" minWidth="55.0" prefWidth="55.0" sortable="false">
<graphic>
<Label text="Total Points" textAlignment="CENTER" wrapText="true" />
</graphic>
</TableColumn>
</columns>
</TableView>
¿Alguna posibilidad de incluir el código que dio como resultado la columna del Jugador con ID y Nombre debajo? – Tommo
¿Quiere decir cómo agregar esas dos columnas debajo de una columna maestra? si es el código es simple: 'tableColumnPlayer.getColumns(). Add (tableColumnID); tableColumnPlayer.getColumns(). Add (tableColumnName); ' – Harry244
encontrado una solución sin utilizar etiquetas. En Scene Builder 8.3.0 (Gluon), JavaFX 8, aparece un botón al deslizar el mouse, justo a la derecha del campo Texto, donde se puede elegir una línea múltiple desde el menú.
Esto resulta en una siguiente código XML:
<TableColumn fx:id="prodDisc" editable="false" prefWidth="50.0" text="Prod Disc" />
- 1. encabezados de tabla Creación de varias filas
- 2. columna de la tabla no tomará el tamaño completo de la vista de tabla en javaFX
- 3. ¿Cómo cambiar dinámicamente el estilo de línea en el gráfico de líneas JavaFX 2.0?
- 4. Cambie el nombre del encabezado de tabla
- 5. Creación de una tabla HTML con texto orientado verticalmente como encabezado de tabla
- 6. Clasificación de tabla con encabezado muticolumna y valores corporales usando el clasificador de tabla
- 7. Centrado único encabezado de la tabla LaTeX
- 8. ModelMultipleChoiceField como tabla de varias columnas
- 9. css only - Desbordamiento de tabla con encabezado fijo
- 10. Subventana JavaFX 2.0
- 11. ¿Se puede redistribuir JavaFX 2.0?
- 12. Varias columnas en la vista de tabla
- 13. h2 sql, crear tabla con clave primaria de varias columnas?
- 14. tabla de frecuencia con varias variables en R
- 15. N superior por grupo con varias combinaciones de tabla
- 16. Ventana de JavaFX 2.0 a la bandeja
- 17. ¿Cómo puedo obtener la columna de tabla correspondiente (td) de un encabezado de tabla (th)?
- 18. Interfaz de usuario para ordenar una tabla por varias columnas
- 19. escribir csv con dos líneas de encabezado?
- 20. Tabla de HTML único de varias tablas de MySQL
- 21. Eliminando líneas de tabla y espacio de tabla entre celdas en css
- 22. Actualización de la tabla con valores de otra tabla
- 23. Tabla HTML desplazable con encabezado fijo y columna fija
- 24. Unir varias columnas de una tabla a una sola columna de otra tabla
- 25. Imprimir tabla html con encabezado personalizado en páginas subsiguientes
- 26. Restricción de la tabla de SQLite: única en varias columnas
- 27. Consulta eficiente de la tabla Postgres de varias particiones
- 28. ¿Ejecuta la función de valor de tabla en varias filas?
- 29. comando de bash que abarca varias líneas con varias líneas de comentarios en el medio
- 30. Tabla = Tabla vs Tabla. Datos (Tabla)
En primer lugar, jewelsea ... Siempre valoro sus respuestas. Estoy notando un comportamiento extraño en Java 8 con esta solución. Inicialmente, todo se ve bien, pero si hago doble clic en los divisores del encabezado de la columna (que generalmente ajusta el tamaño de la columna para que se ajuste a los contenidos), sigue aumentando el ancho de la columna. Nunca se hace más pequeño, solo más grande. ¿Alguna sugerencia o idea de por qué podría estar pasando? – Tommo
Lo esencial no se compila. –
Compila y funciona bien para mí en JavaFX 9.0.4, todavía sufre el problema señalado por Tommo. – jewelsea