2012-06-24 252 views
17

Me gustaría saber cómo llenar un TableView con datos ... Todos los ejemplos que he visto crean un TableView con columnas y todo y agregarlo a la escena. Todo hecho en el código de Java en sí.Cómo llenar un TableView que está definido en un archivo fxml que está diseñado en JavaFx Scene Builder

Lo que quiero saber: si diseño mi "formulario" en JavaFx Scene builder. Definir todas las tablas y columnas en su. ¿Cómo puedo acceder para llenarlo desde Java? O si alguien puede indicarme un tutorial apropiado sobre esto, por favor.

he definido mi forma de JavaFX Escena Builder - sólo TableView con 3 columnas

<?xml version="1.0" encoding="UTF-8"?> 

<?import java.lang.*?> 
<?import java.util.*?> 
<?import javafx.scene.control.*?> 
<?import javafx.scene.layout.*?> 
<?import javafx.scene.paint.*?> 

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="288.0" prefWidth="293.0" xmlns:fx="http://javafx.com/fxml"> 
<children> 
    <TableView fx:id="tableView" layoutX="35.0" layoutY="28.0" prefHeight="200.0" prefWidth="227.0"> 
    <columns> 
     <TableColumn prefWidth="75.0" text="UserId" fx:id="UserId" /> 
     <TableColumn prefWidth="75.0" text="UserName" fx:id="UserName" /> 
     <TableColumn prefWidth="75.0" text="Active" fx:id="Active" /> 
    </columns> 
    </TableView> 
</children> 
</AnchorPane> 

tengo mis datos en un conjunto de resultados en mi código Java.

ResultSet rs = c.createStatement().executeQuery(SQL); 

Necesito llenar el TableView.

Gracias

Respuesta

35

Para acceder a tableView es necesario definir un controlador de la página FXML. Añadir

fx:controller="path.to.MyController" 

atributo a la AnchorPane en el archivo FXML. A continuación, cree el controlador y vincular TableView, TableColumns de archivo FXML poniendo @FXML anotación frente a estas variables:

package path.to; 

public class MyController implements Initializable { 

    @FXML private TableView<User> tableView; 
    @FXML private TableColumn<User, String> UserId; 
    @FXML private TableColumn<User, String> UserName; 
    @FXML private TableColumn<User, String> Active; 

    @Override 
    public void initialize(URL location, ResourceBundle resources) { 
     UserId.setCellValueFactory(new PropertyValueFactory<User, String>("id")); 
     UserName.setCellValueFactory(new PropertyValueFactory<User, String>("name")); 
     Active.setCellValueFactory(new PropertyValueFactory<User, String>("active")); 

     tableView.getItems().setAll(parseUserList()); 
    } 
    private List<User> parseUserList(){ 
     // parse and construct User datamodel list by looping your ResultSet rs 
     // and return the list 
    } 
} 

El tableview se rellena en el método initialize. Tenga en cuenta que en el controlador no estamos creando nuevas tablas o columnas de tabla, ya que ya están creadas cuando se está cargando el archivo FXML. También tenga en cuenta que los nombres de las variables TableView y Tablecolumn deben ser los mismos con los valores de fx:id en el archivo FXML correspondiente. Por lo tanto, mientras UserId, UserName y Active names no son nombres convenientes, cámbielos tanto en el archivo FXML como en Controller a nombres como userIdCol, userNameCol y userActiveCol, respectivamente.

+0

Gracias-no sabía de los controladores :) – Chrispie

+2

Lo que deberían estar en el usuario de la clase? – Chiranjib

+3

Gracias por esta respuesta. Sin embargo, una nota rápida: la interfaz Inicializable ya no es necesaria. No tienes que implementarlo. Simplemente tenga un método en su Controlador: '@FXML private void initialize()' y será llamado por FXMLLoader. [Prueba en documentos] (http://download.java.net/jdk8/jfxdocs/javafx/fxml/Initializable.html) – alisianoi

0

Yo puede hacer esto en su controlador:

@FXML 
private TableView<User> table; 
private List<User> users; 

@Override 
public void initialize(URL url, ResourceBundle rb) { 
    // Set the columns width auto size 
    table.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE); 
    table.getColumns().get(0).prefWidthProperty().bind(table.widthProperty().multiply(0.33)); // 33% for id column size 
    table.getColumns().get(1).prefWidthProperty().bind(table.widthProperty().multiply(0.33)); // 33% for dt column size 
    table.getColumns().get(2).prefWidthProperty().bind(table.widthProperty().multiply(0.33)); // 33% for cv column size 
    table.getItems().setAll(this.users); 
} 
Cuestiones relacionadas