style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">

Agregar elementos en un TableView en JavaFX

Hola:

Recién me inicio en la programa en JavaFX. Estoy utilizando el Scene Builder y en la escena coloqué un objeto TableView. A un botón le puse el código como evento:

tableview1.getItems().add("1er elemento");

Durante la ejecución, se nota claramente que se agrega una fila al TableView pero en blanco. No se visualiza el texto "1er elemento" en ninguna de las columnas.

Quisiera saber cómo hacer para insertar las filas en el TableView con texto en cada una de sus columnas.

Muchas gracias por la ayuda.

Opciones de visualización de comentarios

Seleccione la forma que prefiera para mostrar los comentarios y haga clic en «Guardar las opciones» para activar los cambios.

Para que agregues contenido a

Para que agregues contenido a un TableView, primero debes crear columnas(TableColumn), luego agregas contenido a la columna, luego agregas
la columna al TableView.

mmm... Tu explicacion me

mmm... Tu explicacion me ayuda a entender algunos textos que lei, pero podrias ponerme un codigo de ejemplo para una fila? Gracias.

Imagen de Jose Manuel

Se ve que no has buscado

Los links propuestos si los

Los links propuestos si los he leido, pero no comprendo el procedimiento ni el porque se deben crear objetos aparte del tableview ya existente. Por eso solicitaba un ejemplo muy simple omitiendo la creacion de tableview. Si me das uno, te lo agradecere.

Imagen de CuicaJavier

Sigue los pasos

Buenas creo que si sigues los pasos del link que te paso Jose Manuel entenderas todo el procedimeinto de inicio a fin.

Bueeeeeeeeeno... gracias por

Bueeeeeeeeeno... gracias por la poca ayuda.

Imagen de Jose Manuel

Ejemplo

Ok, entonces veamos un ejemplo. Primero veamos como hacer un objeto TableView y como agregar columnas a ese objeto. Para eso nos vamos a basar en el link que te di.

Primero ocupamos un objeto TableView, lo crearemos como un miembro privado de la clase:
private TableView tabla = new TableView();
Perfecto, ahora ocupamos unas cuantas columnas para esta tabla:

TableColumn nombre = new TableColumn("Nombre");
TableColumn apellido = new TableColumn("Apellido");
TableColumn email = new TableColumn("Email");

Que bonito, ahora agregamos las columnas a las tablas:

 tabla.getColumns().addAll(nombre, apellido, email);

Si ejecutas eso (ya arreglado) lo único que mostrara sera una tabla con sus columnas pero estará vacía. Para poder insertar/agregar información a la tabla debemos crear un modelo. Este modelo sera un objeto, en el ejemplo es una clase llamada Persona, entonces el objeto es de tipo Persona. Primero hay que definir como sera nuestro modelo; este seria el contenido (lo que nos interesa) de la clase Persona :

        private final SimpleStringProperty nombre; //Observa de que tipo son estos objetos, es una clase usada para definir propiedades y con ella podemos
        private final SimpleStringProperty apellido;//acceder a los atributos/propiedades/campos de la clase
        private final SimpleStringProperty email;//en este caso, la propiedad es de tipo String.

        public Persona(String nombre, String apellido, String email) {
            this.nombre = new SimpleStringProperty(nombre);//Dentro del constructor asignamos el valor a los
            this.apellido = new SimpleStringProperty(apellido);//atributos .
            this.email = new SimpleStringProperty(email);
        }

       //Lo que sigue a continuación son los getters, estos serán usados para acceder a los atributos.

        public String getNombre() {
            return nombre.get();
        }

        public String getApellido() {
            return apellido.get();
        }

        public String getEmail() {
            return email.get();
        }

Hasta allí, ya tenemos el modelo, este sera usado para agregar la información a la tabla pero, ¿Como? Ah pues bueno, hay que ligar cada atributo a cada columna, la primer fase para ligar esta información es con el objeto SimpleStringProperty ahora debemos indicarle a las columnas que tipo de datos recibirán.

Primero tenemos que modificar un poco las columnas, quedando asi:

TableColumn<Persona, String> nombre = new TableColumn<>("Nombre");//La columna es de tipo Persona y el contenido de la columna es de tipo String.
nombre.setCellValueFactory(new PropertyValueFactory<Persona, String>("nombre"));//De esta manera es como obtiene los datos la columna, aquí ya hemos ligado el modelo con la columna.
//Observa como es que el objeto PropertyValueFactory recibe un String con el atributo de la clase Persona al que queremos acceder y obtener.

//Lo mismo para las otras columnas
TableColumn<Persona, String> apellido = new TableColumn<>("Apellido");
apellido.setCellValueFactory(new PropertyValueFactory<Persona, String>("apellido"));

TableColumn<Persona, String> email = new TableColumn<>("Email");
email.setCellValueFactory(new PropertyValueFactory<Persona, String>("email"));

Perfecto, ya tenemos las columnas con su correspondiente tipo de dato, ya están ligadas al modelo y el modelo ya tiene definidas sus propiedades. Solo queda decirle a la tabla que agregue los datos a las columnas, para poder hacer esto, haremos uso de una colección de JavaFX, una lista observable.

//Creamos el objeto datos y le agregamos algunos objetos de tipo Persona
final ObservableList<Persona> datos = FXCollections.observableArrayList(
                new Persona("Jose 1", "Manuel", "kaltwulx@blabla"),
                new Persona("Jose 2", "Manuel", "kaltwulx@blabla"),
                new Persona("Jose 3", "Manuel", "kaltwulx@blabla"));

tabla.setItems(datos);//Agregamos los datos en la tabla, aquí la tabla ya muestra la información.

Ahora si tenemos nuestra tabla con sus datos, cada uno en su correspondiente columna. Todo esto gracias a que definimos un modelo y hemos ligado las propiedades de la clase a las columnas correspondientes. Entonces, ahora cada ves que quieras modificar el contenido de la tabla tendrás que recurrir a la lista observable y hacerlo allí.
El código completo quedaría así:

import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

/**
 *
 * @author kalt
 */

public class Tabla extends Application {

    private TableView<Persona> tabla = new TableView();

    @Override
    public void start(Stage primaryStage) {

        TableColumn<Persona, String> nombre = new TableColumn<>("Nombre");
        nombre.setCellValueFactory(new PropertyValueFactory<Persona, String>("nombre"));

        TableColumn<Persona, String> apellido = new TableColumn<>("Apellido");
        apellido.setCellValueFactory(new PropertyValueFactory<Persona, String>("apellido"));

        TableColumn<Persona, String> email = new TableColumn<>("Email");
        email.setCellValueFactory(new PropertyValueFactory<Persona, String>("email"));

        tabla.getColumns().addAll(nombre, apellido, email);

        final ObservableList<Persona> datos = FXCollections.observableArrayList(
                new Persona("Jose 1", "Manuel", "kaltwulx@blabla"),
                new Persona("Jose 2", "Manuel", "kaltwulx@blabla"),
                new Persona("Jose 3", "Manuel", "kaltwulx@blabla"));

        tabla.setItems(datos);

        tabla.setColumnResizePolicy(TableView.CONSTRAINED_RESIZE_POLICY);

        Scene scene = new Scene(tabla, 300, 250);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

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

    public static class Persona {

        private final SimpleStringProperty nombre;
        private final SimpleStringProperty apellido;
        private final SimpleStringProperty email;

        public Persona(String nombre, String apellido, String email) {
            this.nombre = new SimpleStringProperty(nombre);
            this.apellido = new SimpleStringProperty(apellido);
            this.email = new SimpleStringProperty(email);
        }

        public String getNombre() {
            return nombre.get();
        }

        public String getApellido() {
            return apellido.get();
        }

        public String getEmail() {
            return email.get();
        }
    }
}

Espero que entiendas, la verdad a mi aun me falta mucho por aprender sobre JavaFX, por lo que es muy probable que tenga algunos errores de definición.
Saludos.

Gracias por el código...

Gracias por el código... Verás. Estoy usando el Scene Builder y ya tengo insertada la tabla en escena. Pongo tu código (el del link) en START y la tabla ni siquiera aparece con los datos programados.

Pongo el código en INITIALIZE y el compilador me vota errores.

Por eso plantee mi panorama inicial: Estoy usando Scene Builder y ya tengo la tabla creada. Quiero gregar filas omitiendo la creación de la tabla. Que el código de agregado de filas se encuentre en un botón, qué código debería ser ese?

Bueno, ni modo. Gracias, muchachos, en serio, por la ayuda.

Prefiero los componentes de Embarcadero o de Microsoft, directo al grano con el objeto creado.

Imagen de Jose Manuel

Entonces no probaste mi

Entonces no probaste mi código, sino el del link? En ese caso hubieras probado el de link desde un principio, para que pedías un ejemplo...

Yo considero que cuando uno inicia en algo lo mejor es aprender a hacer todo a mano. El usar herramientas como el Scene Builder es bueno pero ya para cuando tienes algo de callo, cuando entiendes que es cada cosa y ahora si, a desarrollar con rapidez. Y si estas usando esta herramienta sabrás que debes usar el archivo que genera (*.FXML) e importarlo a tu proyecto, ligar tu código con tu archivo. El resto es igual o parecido a como yo te explique.

En youtube encontré este vídeo, el tipo no habla pero el vídeo se explica a si mismo de manera bastante clara. En el verás como es que de crear la tabla puedes ligarla y agregar, eliminar datos.

De nuevo, todo se resume a que no buscaste bien, que ademas te faltan nociones básicas. Y sumado a todo eso, tienes una percepción incorrecta de lo que es un foro y del papel que juegan sus miembros; no se ayuda por recibir agradecimientos, se hace porque a uno le gusta compartir lo poco o mucho que sabe, aunque aveces lo que uno cree conocer esta mal.
Saludos.

Hola: Muchas gracias por el

Hola: Muchas gracias por el video. Logré orientarme mejor.

Tienes razón al decir que me faltan nociones básicas (aunque el término es muy relativo). Me inicio hace muy poco en Java y estoy mudando un sistema de Delphi a Java sólo por cuestiones didácticas. No esperaba tener que crear una clase, una lista observable y columnas por separado para poder dar vida a la tabla, todo ello me confundia pues esperaba un control muy semejante a los existentes en otros lenguajes.

El video y tu explicación me han sido útiles. No malinterpreto la función de los foristas, pero tú si malinterpretaste mis esfuerzos por buscar la información, porque encontré mucho material respecto a esto y todos me decían lo mismo sin poder comprender el "por qué".

Muchas gracia, una vez más. Queda solucionado.

ayudaaa!!!

hola un favor acabo de leer toda la informacion que brindast y pues si pude crear un table view usando un modelo...pero la pregunta que les tengo es que si hay la posibilidad o si me pueden ayudar a llenar un table view sin usar un modelo como el de persona???

style="display:inline-block;width:728px;height:90px"
data-ad-client="ca-pub-5164839828746352"
data-ad-slot="7563230308">