В этом уроке мы разберемся как работать с TableView и научимся выводить POJO в TableView.

Создавать форму мы будем с помощью SceneBuilder, как его настроить можно почитать тут.

Структура нашего проекта:

Теперь пройдем по всем шагам создания данного проекта, и разберемся с деталями.

 

Шаг 1

Создаем простой JavaFX проект:

И редактируем класс Main.java:

package sample;

import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

public class Main extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Parent root = FXMLLoader.load(getClass().getResource("views/main.fxml"));
        primaryStage.setTitle("Users List");
        primaryStage.setScene(new Scene(root));
        primaryStage.show();
    }


    public static void main(String[] args) {
        launch(args);
    }
}

Как видите в 13 строке мы указываем какой fxml файл будем использовать.

Создайте пакет views и в нем будем хранить наши views.

 

Шаг 2

Создаем view называем её main.fxml:

<?xml version="1.0" encoding="UTF-8"?>

<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.*?>

<AnchorPane id="AnchorPane" maxHeight="-Infinity" maxWidth="-Infinity" 
            minHeight="-Infinity" minWidth="-Infinity" 
            prefHeight="400.0" prefWidth="624.0" 
            xmlns:fx="http://javafx.com/fxml/1" xmlns="http://javafx.com/javafx/2.2" 
            fx:controller="sample.controller.Controller">
  <children>
    <!-- Таблица в которую мы будем выводит наш pojo -->
    <TableView fx:id="tableUsers" layoutX="12.0" layoutY="62.0" prefHeight="324.0" prefWidth="600.0">
      <columns>
        <!-- Колонки таблицы -->
        <TableColumn prefWidth="80.0" text="№" fx:id="idColumn" />
        <TableColumn prefWidth="150.0" text="Login" fx:id="loginColumn" />
        <TableColumn prefWidth="150.0" text="Password" fx:id="passwordColumn" />
        <TableColumn prefWidth="220.0" text="Email" fx:id="emailColumn" />
      </columns>
    </TableView>
    <Label layoutX="14.0" layoutY="18.0" text="List all users:">
      <font>
        <Font name="Verdana" size="24.0" />
      </font>
    </Label>
  </children>
</AnchorPane>

В 11-й строке мы привязываем данную view на определённый контроллер который будет управлять содержимым view.

Выглядеть будущее окно будет так:

 

Шаг 3

Теперь создадим POJO которое будем выводить в таблице.

package sample.pojo;

public class User {

    private int id;
    private String login;
    private String password;
    private String email;

    public User(int id, String login, String password, String email) {
        this.id = id;
        this.login = login;
        this.password = password;
        this.email = email;
    }

    public User() {
    }

    public int getId() {
        return id;
    }

    public void setId(int id) {
        this.id = id;
    }

    public String getLogin() {
        return login;
    }

    public void setLogin(String login) {
        this.login = login;
    }

    public String getPassword() {
        return password;
    }

    public void setPassword(String password) {
        this.password = password;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }
}

На основе этого класса мы будем формировать данные для заполнения таблицы.

 

Шаг 4

А теперь реализуем мозг нашего приложения, а именно контроллер. Создаем новый пакет controller и в нем создаем класс Controller.java:

package sample.controller;

import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.fxml.FXML;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import sample.pojo.User;

import javafx.scene.control.TableColumn;

public class Controller {

    private ObservableList<User> usersData = FXCollections.observableArrayList();

    @FXML
    private TableView<User> tableUsers;

    @FXML
    private TableColumn<User, Integer> idColumn;

    @FXML
    private TableColumn<User, String> loginColumn;

    @FXML
    private TableColumn<User, String> passwordColumn;

    @FXML
    private TableColumn<User, String> emailColumn;

    // инициализируем форму данными
    @FXML
    private void initialize() {
        initData();

        // устанавливаем тип и значение которое должно хранится в колонке
        idColumn.setCellValueFactory(new PropertyValueFactory<User, Integer>("id"));
        loginColumn.setCellValueFactory(new PropertyValueFactory<User, String>("login"));
        passwordColumn.setCellValueFactory(new PropertyValueFactory<User, String>("password"));
        emailColumn.setCellValueFactory(new PropertyValueFactory<User, String>("email"));

        // заполняем таблицу данными
        tableUsers.setItems(usersData);
    }

    // подготавливаем данные для таблицы
    // вы можете получать их с базы данных
    private void initData() {
        usersData.add(new User(1, "Alex", "qwerty", "alex@mail.com"));
        usersData.add(new User(2, "Bob", "dsfsdfw", "bob@mail.com"));
        usersData.add(new User(3, "Jeck", "dsfdsfwe", "Jeck@mail.com"));
        usersData.add(new User(4, "Mike", "iueern", "mike@mail.com"));
        usersData.add(new User(5, "colin", "woeirn", "colin@mail.com"));
    }

}

@FXML – эта аннотация говорит о том, что поле или метод класса доступны для разметки fxml.

Как видите мы аннотируем переменные, которые должны называться также как и id компонента разметки:

@FXML
private TableView<User> tableUsers;

тогда в разметке fxml должно быть так:

<TableView fx:id="tableUsers">
   ...
</TableView>

 

Шаг 5

Теперь можно запустить наше приложение и посмотреть на результат:

 

01/10/2013

17 комментариев к статье "JavaFX 2. Как вывести данные в TableView?"

  1. Спасибо за пример! А как обновить tableView , если например ежесекундно изменяются POJO объекты ?

  2. Здравствуйте! Спасибо Вам за очень внятную статью! Но хотелось бы кое-что уточнить….
    1. Является ли в данном случае POJO – моделью?
    2. Где правильней всего хранить промежуточные данные? Допустим, у Вас они хранятся в Контроллере. Но это, наверное, не совсем правильно, не так ли?
    3. Какие средства следует использовать чтобы произвести чтение с XML файла в таблицу и как при этом изменится структура проекта?
    Спасибо!

  3. Если добавить поле ВСЕГО, то как там записать сумму всех Юзеров?

  4. Если вместо Login (a = 2) цифра, Password (b=2) цифра, Email(c = a* b).Если изменяется значение ячейки, то должно меняться значение TableView. Как это реализовать?

  5. Господа. Что-то не работает как у вас описано. В таблицу загружает, но ничего не отображает. Данные внутри точно есть, в консоль выводит.
    Методо table.setVisible(true) не помог. Что может быть, не подскажете?

    • проверь что бы все fx:id совпадали в контролере

      • Почти такая проблема. Все fx:id правильно записаны, но в таблицу прописывает только первую колонку, а вторую оставляет пустой. В консоле проверял, все работает. Подскажите в чем может быть проблема, ПЛЗ

  6. Здравствуйте, а как таблицу Tableview заполнять из написанного мной списка ?

  7. Добрый день.
    Вы в последнем методе упомянули про импорт из базы данных.
    // подготавливаем данные для таблицы
    // вы можете получать их с базы данных
    private void initData() {
    usersData.add(new User(1, “Alex”, “qwerty”, “alex@mail.com”));
    usersData.add(new User(2, “Bob”, “dsfsdfw”, “bob@mail.com”));
    usersData.add(new User(3, “Jeck”, “dsfdsfwe”, “Jeck@mail.com”));
    usersData.add(new User(4, “Mike”, “iueern”, “mike@mail.com”));
    usersData.add(new User(5, “colin”, “woeirn”, “colin@mail.com”));
    }
    А можно пример?
    У меня есть приложение, которое в консоль выводит результат из БД Firebird.
    А вот прикрутить к JavaFX Application не выходит((

  8. Супер!

Добавить комментарий

Ваш e-mail не будет опубликован.

Devcolibri team © 2018 All rights reserved