2012-06-24 33 views
17

Tôi muốn biết cách tạo một TableView với dữ liệu ... Tất cả các ví dụ tôi đã thấy tạo ra một TableView với các cột và tất cả mọi thứ và thêm nó vào hiện trường. Tất cả được thực hiện trong chính mã java.Cách điền một TableView được định nghĩa trong tệp fxml được thiết kế trong JavaFx Scene Builder

Điều tôi muốn biết: nếu tôi thiết kế "biểu mẫu" trong trình tạo cảnh JavaFx. Xác định tất cả các bảng và cột trong của chúng. Làm thế nào để tôi truy cập nó để điền nó từ java? Hoặc nếu ai đó có thể chỉ cho tôi một hướng dẫn thích hợp về điều này xin vui lòng.

tôi đã xác định hình thức của tôi trong JavaFX Scene Builder - chỉ một TableView với 3 Cột

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

Tôi có dữ liệu của tôi trong một ResultSet trong mã Java của tôi.

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

Tôi cần điền bảng này.

Cảm ơn

Trả lời

35

Để truy cập vào chế độ xem bảng, bạn cần xác định bộ điều khiển trang FXML của bạn. Thêm

fx:controller="path.to.MyController" 

thuộc tính vào AnchorPane trong tệp FXML. Sau đó tạo ra bộ điều khiển và liên kết TableView, TableColumns từ file FXML bằng cách đặt @FXML chú thích trước các biến:

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

Các tableview được phổ biến trong phương pháp initialize. Lưu ý rằng trong bộ điều khiển chúng ta không tạo ra tableview hoặc tablecolumns mới, vì chúng đã được tạo ra khi tập tin FXML đang được nạp. Cũng lưu ý rằng các tên biến TableView và Tablecolumn phải giống với giá trị fx:id trong tệp FXML tương ứng. Vì vậy, trong khi UserId, tên người dùng và tên hoạt động không phải là tên thuận tiện, hãy thay đổi chúng cả trong tệp FXML và trong Bộ điều khiển thành các tên như userIdCol, userNameCol và userActiveCol tương ứng.

+0

Cảm ơn-, đã không hề biết về điều khiển :) – Chrispie

+2

gì phải ở trong lớp người dùng? – Chiranjib

+3

Cảm ơn câu trả lời này. Một lưu ý nhanh chóng mặc dù: giao diện Initializable không còn cần thiết. Bạn không phải thực hiện nó. Chỉ cần có một phương thức trong Controller của bạn: '@FXML private void initialize()' và nó sẽ được gọi bởi FXMLLoader. [Bằng chứng trong tài liệu] (http://download.java.net/jdk8/jfxdocs/javafx/fxml/Initializable.html) – alisianoi

0

Yo có thể làm điều này trong điều khiển của bạn:

@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); 
} 
Các vấn đề liên quan