我想在tableview控件中添加脏/验证行的功能,用户将被强制编辑新添加的行,否则将被删除。
什么是聚焦新添加的行的第一个单元格(编辑器为ComboboxTableCell
)的最佳方法。新行添加了
tableview.getItems().getItems().addAll(new Item())
提前致谢。
以下是控制器和视图的代码:
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>
答案 0 :(得分:2)
您可以使用TableView.edit()
方法:
tableview.getItems().getItems().add(new Item());
int lastItemIndex = tableview.getItems().size() - 1 ;
tableview.edit(lastItemIndex, someColumn);
其中someColumn
是包含您要编辑的单元格的TableColumn
。