简体   繁体   English

JavaFX 8 TableView添加行和焦点

[英]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. 我想向tableview控件添加一个dirty / validated row的功能,在该控件中,用户将被迫编辑新添加的行,否则它将被删除。 What is best way to focus the first cell (the editor of which is ComboboxTableCell ) of the newly added row. 什么是最好的方式来集中新添加的行的第一个单元格(其编辑器是ComboboxTableCell )。 The new row is added with tableview.getItems().getItems().addAll(new Item()) 新行添加有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>

You can use the TableView.edit() method: 您可以使用TableView.edit()方法:

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. 其中someColumn是包含要编辑单元格的TableColumn

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM