zpavel
zpavel

Reputation: 969

Javafx 8 tableview add row and focus

I would like to add a functionality of dirty/validated row to the tableview control, where the user will be forced to edit the newly added row, otherwise it will be removed. What is best way to focus the first cell (the editor of which is ComboboxTableCell) of the newly added row. The new row is added with tableview.getItems().getItems().addAll(new Item())

Thanks in advance.

Here is the code of the controller and of the view :

public class SaleDetailController implements Initializable {
    @FXML
    private TableView<SaleDetail> saleDetailTable;

    @FXML
    private TableColumn<SaleDetail, Product> productColumn;

    @FXML
    private TableColumn<SaleDetail, Integer> quantityColumn;

    public void initialize(URL location, ResourceBundle resources) {
    productColumn.setCellFactory(ComboBoxTableCell.forTableColumn(FXCollections.observableArrayList(DaoFactory.getProductDao().getAll())));
        productColumn.setCellValueFactory(cellData -> new SimpleObjectProperty(cellData.getValue().getProduct()));
        quantityColumn.setCellFactory(TextFieldTableCell.forTableColumn(new IntegerStringConverter()));
        quantityColumn.setCellValueFactory(cellData -> new SimpleObjectProperty(cellData.getValue().getQuantity()));
    }

   @FXML
   private void handleRemoveProductButton(ActionEvent event) {
       int selectedIndex = saleDetailTable.getSelectionModel().getSelectedIndex();
        if (selectedIndex >= 0) {
            saleDetailTable.getItems().remove(selectedIndex);
        }
    }

    @FXML
    private void handleAddProductButton(ActionEvent event) {
        SaleDetail saleDetail = new SaleDetail();
        saleDetail.setQuantity(0);
        Product product = new Product();
        saleDetail.setProduct(product);
        saleDetailTable.getItems().addAll(saleDetail);

        saleDetailTable.getSelectionModel().selectLast();
        saleDetailTable.requestFocus();
        saleDetailTable.getFocusModel().focus(saleDetailTable.getItems().size() - 1);
        saleDetailTable.edit(saleDetailTable.getFocusModel().getFocusedIndex(), productColumn);
    }
}


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

<?import javafx.geometry.Insets?>
<?import javafx.scene.control.*?>
<?import javafx.scene.layout.*?>
<?import javafx.scene.text.Font?>

<VBox fx:id="saleDetailView" minWidth="500.0" spacing="15.0" style="-fx-border-style: solid; -fx-border-color: #D3D3D3;" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.zpavel.controller.SaleDetailController">
    <children>
        <HBox spacing="10.0">
            <children>
                <Label text="Products*" />
                <Button mnemonicParsing="false" onAction="#handleAddProductButton" text="Add" />
                <Button mnemonicParsing="false" onAction="#handleRemoveProductButton" text="Remove" />
            </children>
        </HBox>
        <TableView fx:id="saleDetailTable" editable="true">
            <columns>
                <TableColumn fx:id="productColumn" prefWidth="75.0" text="Product*" />
                <TableColumn fx:id="quantityColumn" prefWidth="75.0" text="Quantity*" />
            </columns>
            <columnResizePolicy>
                <TableView fx:constant="CONSTRAINED_RESIZE_POLICY" />
            </columnResizePolicy>
        </TableView>
    </children>
    <padding>
        <Insets bottom="15.0" left="15.0" right="15.0" top="15.0" />
    </padding>
</VBox>

Upvotes: 0

Views: 1113

Answers (1)

James_D
James_D

Reputation: 209653

You can use the TableView.edit() method:

tableview.getItems().getItems().add(new Item());
int lastItemIndex = tableview.getItems().size() - 1 ;

tableview.edit(lastItemIndex,  someColumn);

where someColumn is the TableColumn containing the cell you want to edit.

Upvotes: 2

Related Questions