Javafx 8 tableview添加行和焦点

时间:2017-03-09 15:04:22

标签: java javafx javafx-2 javafx-8

我想在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>

1 个答案:

答案 0 :(得分:2)

您可以使用TableView.edit()方法:

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

tableview.edit(lastItemIndex,  someColumn);

其中someColumn是包含您要编辑的单元格的TableColumn