Saltar al contenido

¿Cómo puedo completar un ListView en JavaFX usando objetos personalizados?

Sé libre de divulgar nuestra web y códigos con otro, necesitamos tu ayuda para hacer crecer nuestra comunidad.

Solución:

Enfoque de solución

Aconsejo usar una fábrica de células para resolver este problema.

listViewOfWords.setCellFactory(param -> new ListCell() 
    @Override
    protected void updateItem(Word item, boolean empty)  item == null 
);

Aplicación de muestra

añadir imagen

import javafx.application.Application;
import javafx.collections.*;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.stage.Stage;

public class CellFactories extends Application     
    @Override
    public void start(Stage stage) 
        ObservableList wordsList = FXCollections.observableArrayList();
        wordsList.add(new Word("First Word", "Definition of First Word"));
        wordsList.add(new Word("Second Word", "Definition of Second Word"));
        wordsList.add(new Word("Third Word", "Definition of Third Word"));
        ListView listViewOfWords = new ListView<>(wordsList);
        listViewOfWords.setCellFactory(param -> new ListCell() 
            @Override
            protected void updateItem(Word item, boolean empty) 
        );
        stage.setScene(new Scene(listViewOfWords));
        stage.show();
    

    public static class Word 
        private final String word;
        private final String definition;

        public Word(String word, String definition) 
            this.word = word;
            this.definition = definition;
        

        public String getWord() 
            return word;
        

        public String getDefinition() 
            return definition;
        
    

    public static void main(String[] args) 
        launch(args);
    

Notas de implementación

Aunque podría anular toString en su clase de Word para proporcionar una string representación de la palabra destinada a la representación en su ListView, recomendaría proporcionar una fábrica de celdas en ListView para la extracción de los datos de la vista del objeto de la palabra y su representación en su ListView. Con este enfoque, obtiene una separación de preocupaciones, ya que no vincula la vista gráfica de su objeto de Word con su método textual toString; por lo tanto, toString podría continuar teniendo una salida diferente (por ejemplo, información completa sobre los campos de Word con un nombre de palabra y una descripción para fines de depuración). Además, una fábrica de celdas es más flexible ya que puede aplicar varios nodos gráficos para crear una representación visual de sus datos más allá de un simple texto. string (si desea hacer eso).

Además, aparte, recomiendo hacer que sus objetos de Word sean objetos inmutables, eliminando sus setters. Si realmente necesita modificar los objetos de palabra, entonces la mejor manera de manejar eso es tener propiedades observables expuestas para los campos de objeto. Si también desea que su interfaz de usuario se actualice a medida que cambian las propiedades observables de sus objetos, debe hacer que las celdas de su lista estén al tanto de los cambios en los elementos asociados, escuchando los cambios en ellos (que es un poco más complejo en este caso). Tenga en cuenta que la lista que contiene las palabras ya es observable y ListView se encargará de manejar los cambios en esa lista, pero si modificó la definición de la palabra, por ejemplo, dentro de un objeto de palabra mostrado, entonces su vista de lista no detectará los cambios en el definición sin la lógica de escucha adecuada en la fábrica de celdas ListView.

Lo que muestra ListView en este momento es toString() de Word. Para solucionar su problema, simplemente agregue el siguiente método en su clase de Word (esto es solo un ejemplo):

@Override
public String toString()
    return (this.word + " --- Definition: " + this.definition);

Puntuaciones y reseñas

Si conservas algún recelo y disposición de modernizar nuestro enunciado puedes escribir una nota y con gusto lo estudiaremos.

¡Haz clic para puntuar esta entrada!
(Votos: 0 Promedio: 0)



Utiliza Nuestro Buscador

Deja una respuesta

Tu dirección de correo electrónico no será publicada. Los campos obligatorios están marcados con *