2012-06-24 13 views
17

Ich möchte wissen, wie ich ein TableView mit Daten bevölke ... Alle Beispiele, die ich gesehen habe, erstellt ein TableView mit Spalten und alles und fügen Sie es der Szene hinzu. Alles ist im Java-Code selbst erledigt.Wie man ein TableView auffüllt, das in einer fxml-Datei definiert wird, die in JavaFx entworfen wird Scene Builder

Was ich wissen möchte: wenn ich mein "Formular" in JavaFx Scene Builder entwerfe. Definieren Sie alle Tabellen und Spalten in ihren. Wie kann ich darauf zugreifen, um es aus Java zu füllen? Oder wenn mir jemand dazu ein richtiges Tutorial zeigen kann.

Ich habe meine Form in JavaFx Scene Builder definiert - nur eine Tableview mit 3 Spalten

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

ich meine Daten in einem ResultSet in meinem Java-Code.

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

Ich muss das TableView auffüllen.

Dank

Antwort

35

So greifen Sie zu einer Tabellen- benötigen eine Steuerung Ihrer FXML Seite zu definieren. In

fx:controller="path.to.MyController" 

Attribut auf den AnchorPane in FXML Datei. Dann erstellen Sie den Controller und verknüpfen Tableview, Tablecolumns aus FXML Datei durch @FXML Anmerkung vor diesen Variablen setzen:

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

Der Tableview bevölkert ist in der initialize Methode. Beachten Sie, dass wir im Controller keine neue Tabellenansicht oder Tabellenspalten erstellen, da diese bereits erstellt werden, wenn die FXML-Datei geladen wird. Beachten Sie außerdem, dass die Variablennamen der Tabellenansicht und der Tabellenspalte mit den Werten fx:id in der entsprechenden FXML-Datei identisch sein müssen. Während also die Namen UserId, UserName und Active keine praktischen Benennungen sind, ändern Sie sie sowohl in der FXML-Datei als auch in Controller in Namen wie userIdCol, userNameCol und userActiveCol.

+0

Thanks-Artikel nicht wußte von den Controllern :) – Chrispie

+2

Was in der Klasse Benutzer sein sollte? – Chiranjib

+3

Danke für diese Antwort. Ein kurzer Hinweis: Die Schnittstelle Initializable ist nicht mehr erforderlich. Sie müssen es nicht implementieren. Habe einfach eine Methode in deinem Controller: '@FXML private void initialize()' und sie wird vom FXMLLoader aufgerufen. [Beweis in der Dokumentation] (http://download.java.net/jdk8/jfxdocs/javafx/fxml/Initializable.html) – alisianoi

0

Yo kann dies in Ihrem Controller:

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