tabla mostrar llenar datos agregar javafx javafx-8 tablecolumn

javafx - llenar - Cómo mostrar una lista en la columna de la tabla, con pocos campos de elementos de la lista



llenar tableview javafx mysql (2)

Como alternativa a la solución de Uluk, considere configurar la fábrica de células en la columna, en lugar del valor de celda de fábrica. La elección entre estos depende de cómo considere la relación entre la columna y el modelo ( Person ). Si considera que la lista de nombres es la información que muestra la columna, entonces la solución de Uluk es el camino a seguir. Si considera que la lista de objetos Person es la información que se muestra por sus nombres, esta será la opción más intuitiva:

TableColumn<Person, List<Person> thirdCol = new TableColumn<>("Friends"); PropertyValueFactory<Person, List<Person>> thirdColFactory = new PropertyValueFactory<>("friends"); thirdCol.setCellValueFactory(thirdColFactory); thirdCol.setCellFactory(col -> new TableCell<Person, List<Person>>() { @Override public void updateItem(List<Person> friends, boolean empty) { super.updateItem(friends, empty); if (empty) { setText(null); } else { setText(friends.stream().map(Person::getName) .collect(Collectors.joining(", "))); } } });

Esto hace que sea fácil cambiar la forma en que se muestra la lista en esa columna, por ejemplo:

thirdCol.setCellFactory( col -> { ListView<Person> listView = new ListView<>(); listView.setCellFactory(lv -> new ListCell<Person>() { @Override public void updateItem(Person person, boolean empty) { super.updateItem(person, empty); if (empty) { setText(null); } else { setText(person.getName()); } } }); return new TableCell<Person, List<Person>>() { @Override public void updateItem(List<Person> friends, boolean empty) { super.updateItem(friends, empty); if (empty) { setGraphic(null); } else { listView.getItems().setAll(friends); setGraphic(listView); } } }; });

ACTUALIZACIÓN : Esta pregunta trasladada a TableColumn solo debe mostrar un valor específico de un tipo de datos complejo porque es más específico

Quiero rellenar una tabla con un tipo de datos complejo Person contenga name , id y una List<Person> . En este momento tengo una tabla con el name correcto, id y una tercera columna con toda la información de otras Person , pero solo debe mostrar el nombre de las Persons . ¿Hay alguna forma en que mi tercera columna muestre solo los valores de Person.getName() ?

Palabras clave, soluciones bienvenidas! ¡Muchas gracias!

Editar: Código

Persona.clase

public class Person { String id; String name; List<Person> friends; public String getId() {...} public String getName() {....} public List<Person> getFriends {...} }

TableView.class

public TableView<Person> createTable() { TableColumn<Person, String> firstCol = new TableColumn<>("ID"); TableColumn<Person, String> secondCol = new TableColumn<>("Name"); TableColumn<Person, List<Person> thirdCol = new TableColumn<>("Friends"); PropertyValueFactory<Person, String> firstColFactory = new PropertyValueFactory<>( "id"); PropertyValueFactory<Person, String> secondColFactory = new PropertyValueFactory<>( "name"); PropertyValueFactory<Person, List<Person>> thirdColFactory = new PropertyValueFactory<>( "friends"); firstCol.setCellValueFactory(firstColFactory); secondCol.setCellValueFactory(secondColFactory); thirdCol.setCellValueFactory(thirdColFactory); myTableView.getColumns().addAll(firstCol, secondCol, thirdCol); }

Por lo tanto, si llené la tabla id y name -colums contienen el nombre correcto y la tercera columna (con List<Person> ) muestra [Person [id1, John, ...]...]] . Y ahora quiero preguntar si existe la posibilidad de que la tercera columna solo muestre la id o el name sin manipular los datos.


Puede definir fábrica de valores de celda con la versión expandida larga donde controla qué campos mostrar:

thirdColFactory.setCellValueFactory( ( TableColumn.CellDataFeatures<Person, String> p ) -> { List<Person> friends = p.getValue().getFriends(); String val = friends .stream() .map( item -> item.getName() ) .reduce( "", ( acc, item ) -> acc + ", " + item ); return new ReadOnlyStringWrapper( val ); });