web-dev-qa-db-fra.com

Comment remplir une table vue définie dans un fichier fxml conçu dans JavaFx Scene Builder

Je voudrais savoir comment remplir une TableView avec des données ... Tous les exemples que j'ai vus créent une TableView avec des colonnes et tout le reste et l'ajoutent à 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 toutes les colonnes ici. Comment puis-je y accéder pour le peupler à partir de Java? Ou si quelqu'un peut m'indiquer un didacticiel approprié à ce sujet, s'il vous plaît.

J'ai défini ma fiche dans JavaFx Scene Builder - uniquement une table 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);

Je dois remplir le TableView.

Merci

20
Chrispie

Pour accéder à tableview, vous devez définir un contrôleur de votre page FXML. Ajouter

fx:controller="path.to.MyController"

attribut à la AnchorPane dans le fichier FXML. Créez ensuite le contrôleur et liez TableView, TableColumns à partir d'un fichier FXML en plaçant 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   
    }
}

La vue de table est renseignée dans la méthode initialize. Notez que dans le contrôleur, nous ne créons pas de nouvelles tables ou tables de table, car elles ont déjà été créées pendant le chargement du fichier FXML. Notez également que les noms de variable TableView et Tablecolumn doivent être identiques aux valeurs fx:id du fichier FXML correspondant. Ainsi, bien que les noms d'utilisateur, UserName et Active ne soient pas des noms commodes, modifiez-les à la fois dans le fichier FXML et dans le contrôleur en noms tels que userIdCol, userNameCol et userActiveCol.

41
Uluk Biy

Vous pouvez 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);
}
0
multiplayer1080