2017-03-09 114 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