Как получить все элементы TableView Javafx?

482
27 мая 2017, 16:18

Доброго времени суток!
Есть tableView, с которого нужно получить все элементы и сделать UPDATE запрос в SQLite базу. Скажите, каким способом можно это сделать?

package sample;
public class mainFormController{
    @FXML
    TableView tableView;
    @FXML
    TableColumn idColumn;
    @FXML
    TableColumn surnameCol;
    @FXML
    TableColumn nameCol;
    @FXML
    TableColumn secondnameCol;
    @FXML
    TableColumn adressCol;
    @FXML
    TableColumn numberCol;
    @FXML
    TableColumn idstyleCol;
    //club
    @FXML
    TableColumn idColumn2;
    @FXML
    TableColumn descripColumn;
    @FXML
    TableColumn dateColumn;
    @FXML
    TableColumn adressCol2;
    @FXML
    TableView tableView2;

    @FXML
    public void OnExitClick()
    {
        System.exit(0);
    }
    @FXML
    public void LoadAction(ActionEvent event)
    {
        ObservableList<Clients> _list = FXCollections.observableArrayList();
        ObservableList<Club> _list2 = FXCollections.observableArrayList();
        _list = Helper.GetClients("SELECT * FROM clients");
        _list2 = Helper.GetClub("SELECT * FROM club");
        idColumn.setCellValueFactory(new PropertyValueFactory<Clients, Integer>("id"));

        secondnameCol.setCellValueFactory(new PropertyValueFactory<Clients,String>("secondname"));
        secondnameCol.setEditable(true);
        secondnameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        secondnameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Clients, String>>() {
                    @Override
                    public void handle(CellEditEvent<Clients, String> t) {
                        ((Clients) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setSecondname(t.getNewValue());
                    }
                }
        );
        surnameCol.setCellValueFactory(new PropertyValueFactory<Clients,String>("surname"));
        surnameCol.setEditable(true);
        surnameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        surnameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Clients, String>>() {
                    @Override
                    public void handle(CellEditEvent<Clients, String> t) {
                        ((Clients) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setSurname(t.getNewValue());
                    }
                }
        );
        nameCol.setCellValueFactory(new PropertyValueFactory<Clients,String>("name"));
        nameCol.setEditable(true);
        nameCol.setCellFactory(TextFieldTableCell.forTableColumn());
        nameCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Clients, String>>() {
                    @Override
                    public void handle(CellEditEvent<Clients, String> t) {
                        ((Clients) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setName(t.getNewValue());
                    }
                }
        );
        adressCol.setCellValueFactory(new PropertyValueFactory<Clients,String>("adress"));
        adressCol.setEditable(true);
        adressCol.setCellFactory(TextFieldTableCell.forTableColumn());
        adressCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Clients, String>>() {
                    @Override
                    public void handle(CellEditEvent<Clients, String> t) {
                        ((Clients) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setAdress(t.getNewValue());
                    }
                }
        );

        numberCol.setCellValueFactory(new PropertyValueFactory<Clients,String>("phonenumber"));
        numberCol.setEditable(true);
        numberCol.setCellFactory(TextFieldTableCell.forTableColumn());
        numberCol.setOnEditCommit(
                new EventHandler<CellEditEvent<Clients, String>>() {
                    @Override
                    public void handle(CellEditEvent<Clients, String> t) {
                        ((Clients) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setPhonenumber(t.getNewValue());
                    }
                }
        );

        idstyleCol.setCellValueFactory(new PropertyValueFactory<Clients,Integer>("idofstyle"));
        //второй колум
        idColumn2.setCellValueFactory(new PropertyValueFactory<Club,Integer>("id"));
        descripColumn.setCellValueFactory(new PropertyValueFactory<Club,String>("description"));
        descripColumn.setEditable(true);
        descripColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        descripColumn.setOnEditCommit(
                new EventHandler<CellEditEvent<Club, String>>() {
                    @Override
                    public void handle(CellEditEvent<Club, String> t) {
                        ((Club) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setDescription(t.getNewValue());
                    }
                }
        );
        dateColumn.setCellValueFactory(new PropertyValueFactory<Club,String>("dateofbirth"));
        dateColumn.setEditable(true);
        dateColumn.setCellFactory(TextFieldTableCell.forTableColumn());
        dateColumn.setOnEditCommit(
                new EventHandler<CellEditEvent<Club, String>>() {
                    @Override
                    public void handle(CellEditEvent<Club, String> t) {
                        ((Club) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setDateofbirth(t.getNewValue());
                    }
                }
        );

        adressCol2.setCellValueFactory(new PropertyValueFactory<Club,String>("adress"));
        adressCol2.setEditable(true);
        adressCol2.setCellFactory(TextFieldTableCell.forTableColumn());
        adressCol2.setOnEditCommit(
                new EventHandler<CellEditEvent<Club, String>>() {
                    @Override
                    public void handle(CellEditEvent<Club, String> t) {
                        ((Club) t.getTableView().getItems().get(
                                t.getTablePosition().getRow())
                        ).setAdress(t.getNewValue());
                    }
                }
        );

        tableView.setEditable(true);
        tableView2.setEditable(true);
        tableView.setItems(_list);
        tableView2.setItems(_list2);    
    }
    public void SaveItems()
    {
    }
}
Answer 1

Так как вопрос больно общий, то простейшая реализация:

public void saveItems() {
    for ( Clients client : tableView.getItems() ) {
        //здесь надо какую-нибудь проверку, изменилось ли что-нибудь,
        //чтобы лишних запросов в базу не было
        Helper.updateClient( "UPDATE clients " +
            "SET secondname = "  + client.secondname + 
              ", surname = "     + client.surname +
              ", name = "        + client.name  +
              ", adress = "      + client.adress +
              ", phonenumber = " + client.phonenumber  +
              ", idofstyle = "   + client.idofstyle +
           " WHERE id = " + client.id );
    } 
}

Это при условии что в Helperе есть какая-нибудь реализация метода updateClient и НЕ используется PreparedStatement, что было бы неплохо:

updateClientStmt = connection.prepareStatement( " UPDATE clients " +
            "SET secondname = ?, surname = ?, name = ?, adress = ? " +
                 "phonenumber = ?, idofstyle = ?, WHERE id = ?" );

Тогда можно было бы передать все параметрами как аргументы метода, ну да ладно.
( Схему базы я естественно выдумал )

P.S. Кстати, все манипуляции с базой лучше бы производить в отдельном потоке. В FX есть неплохая библиотека `javafx.concurrent'.

READ ALSO
Что в себе содержит Environment?

Что в себе содержит Environment?

Добрый деньКакую информацию в себе содержит интерфейс Environment? Я так понимаю это интерфейс для работы с properties? Откуда он берёт эти properties? И как...

332
Push notification

Push notification

При отображения множества push notification каждому устанавливается свой Pending Intent, но с разными extraно при нажатии на пуш отображается не свой обработчик

253
Как программно задать обработчик webcal для Firefox?

Как программно задать обработчик webcal для Firefox?

Нужно через программу (язык Java) задать обработчик протокола для FirefoxПричем речь идет не о добавлении нового варианта, а именно о задании того...

271