2012-06-24 6 views
17

Je voudrais savoir comment peupler un TableView avec des données ... Tous les exemples que j'ai vus créent un TableView avec des colonnes et tout et l'ajouter à la scène. Tout est fait dans le code Java lui-même. Ce que je veux savoir: si je conçois mon "formulaire" dans le générateur de Scènes JavaFx. Définir toutes les tables et colonnes dans leur. Comment puis-je y accéder pour le peupler à partir de Java? Ou si quelqu'un peut me diriger vers un tutoriel approprié sur ce s'il vous plaît.Comment remplir un TableView qui est défini dans un fichier fxml conçu dans JavaFx Scene Builder

J'ai défini ma forme JavaFX Scene Builder - seulement TableView avec 3 colonnes

<?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> 

J'ai mes données dans un ResultSet dans mon code Java.

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

J'ai besoin de remplir le TableView.

Merci

Répondre

35

Pour accéder à vous tableView besoin de définir un contrôleur de votre page FXML. Ajouter

fx:controller="path.to.MyController" 

attribuer au AnchorPane dans le fichier FXML. Ensuite, créez le contrôleur et le lien TableView, TableColumns à partir du fichier FXML en mettant l'annotation @FXML devant ces 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 
    } 
} 

Le tableview est rempli dans la méthode initialize. Notez que dans le contrôleur, nous ne créons pas de nouvelles tables ou tablecolumns, car elles sont déjà créées lorsque le fichier FXML est en cours de chargement. Notez également que les noms de variable TableView et Tablecolumn doivent être identiques avec les valeurs fx:id dans le fichier FXML correspondant. Donc, alors que UserId, UserName et Active ne sont pas des noms pratiques, changez-les respectivement dans le fichier FXML et dans le Controller avec des noms tels que userIdCol, userNameCol et userActiveCol.

+0

Merci-didnt connaissait les contrôleurs :) – Chrispie

+2

Quels devraient être dans la classe utilisateur? – Chiranjib

+3

Merci pour cette réponse. Une note rapide cependant: l'interface Initializable n'est plus nécessaire. Vous n'êtes pas obligé de l'implémenter. Ayez juste une méthode dans votre contrôleur: '@FXML private void initialize()' et il sera appelé par le FXMLLoader. [Proof in docs] (http://download.java.net/jdk8/jfxdocs/javafx/fxml/Initializable.html) – alisianoi

0

Yo peut le faire dans votre contrôleur:

@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); 
} 
Questions connexes