java - llenar - setcellvaluefactory
Ancho de columna de JavaFX TableView / Contenido truncado automático (1)
Solución
El comportamiento de desbordamiento predeterminado de una TableCell estándar es truncar su cadena y mostrar ...
al final de la cadena para indicar que la cadena se ha truncado. Todos los controles etiquetados en JavaFX funcionan de esta manera.
Los ejemplos en su pregunta tienen ...
elipsis en el medio de las cuerdas. Para lograr eso, configure el estilo de desbordamiento en la celda generada por la fábrica de células adecuada:
setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS);
La cadena de texto mostrada para puntos suspensivos también se puede modificar estableciendo una nueva cadena de puntos suspensivos en la celda generada por la fábrica de células adecuada:
setEllipsisString(ellipsisString);
Una celda de tabla simple que demuestra esto es:
class CenteredOverrunTableCell extends TableCell<Person, String> {
public CenteredOverrunTableCell() {
this(null);
}
public CenteredOverrunTableCell(String ellipsisString) {
super();
setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS);
if (ellipsisString != null) {
setEllipsisString(ellipsisString);
}
}
@Override protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(item == null ? "" : item);
}
}
Solicitud de muestra
El CenteredOverrunTableCell
se utiliza en la siguiente aplicación de muestra.
- La columna Nombre elimina el texto en el centro y usa una cadena de puntos suspensivos personalizada de
<--->
- La columna Apellido elimina el texto en el centro pero no proporciona una cadena de puntos suspensivos personalizada.
- La columna Correo electrónico solo usa la política de desbordamiento predeterminada y la cadena de puntos suspensivos que coloca la
...
elipsis al final de la cadena de desbordamiento.
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.*;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.layout.VBox;
import javafx.scene.text.Font;
import javafx.stage.Stage;
import javafx.util.Callback;
public class ElidedTableViewSample extends Application {
private TableView<Person> table = new TableView<>();
private final ObservableList<Person> data =
FXCollections.observableArrayList(
new Person("Jacob", "Smith", "[email protected]"),
new Person("Isabella", "Johnson", "[email protected]"),
new Person("Ethangorovichswavlowskikaliantayaprodoralisk", "Llanfairpwllgwyngyllgogerychwyrndrobwyll-llantysiliogogogoch", "ethan@llanfairpwllgwyngyllgogerychwyrndrobwyll-llantysiliogogogoch.com"),
new Person("Emma", "Jones", "[email protected]"),
new Person("Michael", "Brown", "[email protected]")
);
public static void main(String[] args) { launch(args); }
@Override public void start(Stage stage) {
stage.setTitle("Table View Sample");
stage.setWidth(470);
stage.setHeight(500);
final Label label = new Label("Address Book");
label.setFont(new Font("Arial", 20));
TableColumn firstNameCol = new TableColumn("First Name");
firstNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("firstName"));
firstNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
@Override public TableCell<Person, String> call(TableColumn<Person, String> p) {
return new CenteredOverrunTableCell("<--->");
}
});
TableColumn lastNameCol = new TableColumn("Last Name");
lastNameCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("lastName"));
lastNameCol.setCellFactory(new Callback<TableColumn<Person, String>, TableCell<Person, String>>() {
@Override public TableCell<Person, String> call(TableColumn<Person, String> p) {
return new CenteredOverrunTableCell();
}
});
TableColumn emailCol = new TableColumn("Email");
emailCol.setCellValueFactory(
new PropertyValueFactory<Person, String>("email"));
table.setItems(data);
table.getColumns().addAll(
firstNameCol,
lastNameCol,
emailCol
);
final VBox vbox = new VBox();
vbox.setSpacing(5);
vbox.setPadding(new Insets(10));
vbox.getChildren().addAll(label, table);
table.setColumnResizePolicy(
TableView.CONSTRAINED_RESIZE_POLICY
);
Scene scene = new Scene(vbox);
stage.setScene(scene);
stage.show();
}
class CenteredOverrunTableCell extends TableCell<Person, String> {
public CenteredOverrunTableCell() {
this(null);
}
public CenteredOverrunTableCell(String ellipsisString) {
super();
setTextOverrun(OverrunStyle.CENTER_WORD_ELLIPSIS);
if (ellipsisString != null) {
setEllipsisString(ellipsisString);
}
}
@Override protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
setText(item == null ? "" : item);
}
}
public static class Person {
private final SimpleStringProperty firstName;
private final SimpleStringProperty lastName;
private final SimpleStringProperty email;
private Person(String fName, String lName, String email) {
this.firstName = new SimpleStringProperty(fName);
this.lastName = new SimpleStringProperty(lName);
this.email = new SimpleStringProperty(email);
}
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);
}
public String getEmail() {
return email.get();
}
public void setEmail(String fName) {
email.set(fName);
}
}
}
Estoy intentando "abreviar" inteligentemente / truncar el contenido de la String
de una columna anidada en un TableView. He intentado usar UNCONSTRAINED_RESIZE_POLICY
pero realmente prefiero CONSTRAINED_RESIZE_POLICY
ya que cambia automáticamente el tamaño de las columnas en función del tamaño de la ventana.
Lo que estoy tratando de lograr:
String one = "SomeVeryLongString";
// Displayed in the column where user has shrunk it too narrow
+-------------+
| Some...ring |
+-------------+
// and if the user shrunk it a bit more
+-----------+
| Som...ing |
+-----------+
// and if they stretch it a bit
+---------------+
| SomeV...tring |
+---------------+
// etc...
He explorado la posibilidad de leer la longitud de String
y hacer mi propio truncamiento, pero luego no es posible tener esta actualización dinámica a medida que el usuario encoge / estira la interfaz gráfica de usuario. Mi intuición dice que esto debe hacerse con las JavaFX Classes
ya que estaría estrechamente relacionado con TableView
, sin embargo, no he encontrado una manera.
¿Cómo puedo lograr esto usando JavaFX
?