JavaFx TableCellEditor - PullRequest
       101

JavaFx TableCellEditor

1 голос
/ 04 марта 2020

У меня есть JavaFx TableView, и я разрешаю пользователю вводить некоторые данные в таблицу и извлекать то, что пользователь ввел в таблицу, по этой причине я также создаю ArrayList из TextFields и использую следующий код, но размер ArrayList должен быть 3 в моем случае, но я нашел размер 7, что не так?

Отредактируйте полный код здесь

import java.util.ArrayList;
import javafx.application.Application;
import javafx.beans.property.SimpleStringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.stage.Stage;

public class TestTableView extends Application
{

    private final TableView <ProductOpeningBalance> tableProductOpeningBalance = new TableView();
    private final Scene scene = new Scene(tableProductOpeningBalance, 400, 200);
    private final TableColumn productQuantity = new TableColumn("Product Quantity");
    private final ObservableList <ProductOpeningBalance> data = FXCollections.observableArrayList(
                                                                new ProductOpeningBalance("0"),
                                                                new ProductOpeningBalance("0"));
    private final ArrayList <TextField> txtProductQuantity = new ArrayList <> ();

    @Override
    public void start(Stage stage)
    {
        productQuantity.impl_setReorderable(false);
        productQuantity.setEditable(true);
        productQuantity.setCellValueFactory(new PropertyValueFactory("ProductQuantity"));
        productQuantity.setCellFactory(column -> new TableCell()
    {
        @Override
        public void startEdit()
        {
            if(!isEmpty())
            {
                super.startEdit();

                createTextField();

                setText(null);

                setGraphic(txtProductQuantity.get(txtProductQuantity.size() - 1));

                txtProductQuantity.get(txtProductQuantity.size() - 1).selectAll();
            }
        }

        @Override
        public void cancelEdit()
        {
            super.cancelEdit();

            setText((String) getItem());

            setGraphic(null);
        }

        public void updateItem(String item, boolean empty)
        {
            super.updateItem(item, empty);

            if(empty)
            {
                setText(null);

                setGraphic(null);
            }

            else
            {
                if(isEditing())
                {
                    if(txtProductQuantity.get(txtProductQuantity.size() - 1) != null)
                    {
                        txtProductQuantity.get(txtProductQuantity.size() - 1).setText(getString());
                    }

                    setText(null);

                    setGraphic(txtProductQuantity.get(txtProductQuantity.size() - 1));
                }

                else
                {
                    setText(getString());

                    setGraphic(null);
                }
            }
        }

        private void createTextField()
        {
            txtProductQuantity.add(new TextField(getString()));

            txtProductQuantity.get(txtProductQuantity.size() - 1).
                                     setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
            txtProductQuantity.get(txtProductQuantity.size() - 1).setAlignment(Pos.BASELINE_RIGHT);
            txtProductQuantity.get(txtProductQuantity.size() - 1).focusedProperty().
            addListener((ObservableValue<? extends Boolean> arg0, Boolean arg1, Boolean arg2) ->
            {
                if(!arg2)
                {
                    commitEdit(txtProductQuantity.get(txtProductQuantity.size() - 1).getText());
                }
            });
        }

        private String getString()
        {
            return getItem() == null ? "" : getItem().toString();
        }
    });

        tableProductOpeningBalance.setEditable(true);
        tableProductOpeningBalance.getColumns().addAll(productQuantity);
        tableProductOpeningBalance.setItems(data);

        stage.setScene(scene);
        stage.show();
    }

    public class ProductOpeningBalance
    {
        private final SimpleStringProperty ProductQuantity;

        public ProductOpeningBalance(String productQuantity)
        {
            this.ProductQuantity = new SimpleStringProperty(productQuantity);
        }

        public void setProductQuantity(String productQuantity)
        {
            ProductQuantity.set(productQuantity);
        }

        public String getProductQuantity()
        {
            return ProductQuantity.get();
        }
    }
}

Решение окончательно:

этот код поможет мне найти то, что я нужно потратить много времени на поиски и пробовать много методов

    purchaseItemPrice.setCellFactory(column -> new TableCell()
    {
        @Override
        public void startEdit()
        {
            if(!isEmpty())
            {
                if(txtPurchaseItemPrice.size() < data.size() && getGraphic() == null)
                {
                    super.startEdit();

                    txtPurchaseItemPrice.add(new TextField());

                    txtPurchaseItemPrice.get(txtPurchaseItemPrice.size() - 1).setAlignment(Pos.BASELINE_RIGHT);

                    setGraphic(txtPurchaseItemPrice.get(txtPurchaseItemPrice.size() - 1));
                }
            }
        }

        public void updateItem(String item, boolean empty)
        {
            super.updateItem(item, empty);

            if(!empty)
            {
                if(isEditing())
                {
                    setGraphic(txtPurchaseItemPrice.get(txtPurchaseItemPrice.size() - 1));
                }
            }
        }
    });
...