Вопрос по javafx-2, tableview, populate, scene, builder – Как заполнить TableView, определенный в файле fxml, который разработан в JavaFx Scene Builder

20

Я хотел бы знать, как мне заполнить TableView данными ... Все примеры, которые я видел, создают TableView со столбцами и всем остальным и добавляют его в сцену. Все сделано в самом коде Java.

Что я хочу знать: если я создам свою «форму» в JavaFx Scene Builder. Определение всех таблиц и столбцов там. Как я могу получить к нему доступ, чтобы заполнить его из Java? Или, если кто-то может указать мне правильный учебник по этому вопросу, пожалуйста.

Я определил свою форму в JavaFx Scene Builder - только TableView с 3 столбцами

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

У меня есть данные в ResultSet в моем коде Java.

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

Мне нужно заполнить TableView.

Спасибо

Ваш Ответ

2   ответа
0

 @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);
}
У меня не сработало
42

вам нужно определить контроллер вашей страницы FXML. добавлять

fx:controller="path.to.MyController"

приписатьAnchorPane в файле FXML. Затем создайте контроллер и свяжите TableView, TableColumns из файла FXML, поместив@FXML аннотация перед этими переменными:

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

Представление таблицы заполняется вinitialize метод. Обратите внимание, что в контроллере мы не создаем новый вид таблицы или столбцы таблицы, поскольку они уже созданы во время загрузки файла FXML. Также обратите внимание, что имена переменных TableView и Tablecolumn должны совпадать сfx:id значения в соответствующем файле FXML. Поэтому, хотя имена UserId, UserName и Active не являются удобными именами, измените их как в файле FXML, так и в Controller на имена, подобные userIdCol, userNameCol и userActiveCol соответственно.

Спасибо за этот ответ. Небольшое замечание: интерфейс Initializable больше не требуется. Вам не нужно это реализовывать. Просто есть метод в вашем контроллере:@FXML private void initialize() и он будет вызван FXMLLoader.Proof in docs
Ага @ all3fox теперь это не обязательно. Буду обновлять пост соответственно. Благодарю.
Спасибо, не знал о контроллерах :) Chrispie
Хотя это старый пост, он спас мой день. Я должен был проголосовать.
Что должно быть в классе User?

Похожие вопросы