Reputation: 969
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
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