2017-03-09 70 views
0

我想向tableview控件添加脏/验证行的功能,在这里用户将被迫编辑新添加的行,否则它将被删除。 什么是聚焦第一个单元格(编辑器是ComboboxTableCell)新增行的最佳方法。新行添加了 tableview.getItems().getItems().addAll(new Item())Javafx 8 tableview add row and focus

在此先感谢。

这里是控制器的代码和视图:

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> 

回答

2

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

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

tableview.edit(lastItemIndex, someColumn); 

其中someColumnTableColumn包含你想要的细胞t编辑。

+0

谢谢您的回复James。我试过你的解决方案。问题是单元格中的组合框不会切换到编辑模式。我也尝试过使用focusModel而没有成功。 – zpavel

+0

您可能需要创建一个[MCVE]来重现问题。编辑您的问题以包含它。 –

+0

我刚刚加了我的代码James。 – zpavel