Событие на ComBox, которое внутри ячейки TableView JavaFx? - PullRequest
2 голосов
/ 09 марта 2020

У меня есть TableView, и когда у моей программы запуска TableView есть только одна строка, также у меня есть ArrayList ComboBox и создать один ComboBox для каждой строки в TableView, когда пользователь редактирует ячейку (Имя продукта) (которая должна содержать ComboBox на нем). ) программа создает ComboBox для этой ячейки и устанавливает ComboBox как ячейку graphi c (когда ComboBox создан, но не удален из ячейки graphi c), и когда пользователь выбирает элемент из последней строки ComboBox, программа должна создать одну строку, программа ведет себя корректно для первого действия ComboBox строки, но во втором ряду это не удалось, обратите внимание, что последний ComboBox только его действие создает одну дополнительную строку не каждый ComboBox, это фото может помочь проиллюстрировать мою проблему

enter image description here

это мой код:

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.Button;
    import javafx.scene.control.ComboBox;
    import javafx.scene.control.TableCell;
    import javafx.scene.control.TableColumn;
    import javafx.scene.control.TableView;
    import javafx.scene.control.cell.PropertyValueFactory;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;

    public class BillDesign extends Application
    {
        private final TableView <Products> tableProducts = new TableView();
        private final TableColumn serial = new TableColumn("Serial");
        private final TableColumn productName = new TableColumn("ProductName");
        private final ObservableList <Products> data = FXCollections.observableArrayList(new Products("1", ""),
                                                                                         new Products("2", ""),
                                                                                         new Products("3", ""),
                                                                                         new Products("4", ""));
        private final Button button = new Button("Click");

        @Override
        public void start(Stage stage)
        {
            serial.setEditable(true);
            serial.setCellValueFactory(new PropertyValueFactory("Serial"));

            productName.setEditable(true);
            productName.setCellValueFactory(new PropertyValueFactory("ProductName"));
            productName.setCellFactory(column -> new TableCell ()
            {
                private ComboBox comboBox;

                @Override
                public void startEdit()
                {
                    if(!isEmpty())
                    {
                        super.startEdit();

                        comboBox = new ComboBox();

                        comboBox.setPrefWidth(getWidth());
                        comboBox.setEditable(true);
                        comboBox.getItems().addAll("A", "B", "C");

                        setGraphic(comboBox);

                        comboBox.setOnAction(e ->
                        {
                            data.get(getIndex()).setProductName(comboBox.getSelectionModel().getSelectedItem().
                                                                toString());

                            if(getIndex() == data.size() - 1)
                            {
                                data.add(new Products(String.valueOf(data.size() + 1), ""));
                            }
                        });
                    }
                }
            });

            button.setOnMouseClicked(e ->
            {
                for(int i = 0; i < data.size(); i++)
                {
                    System.out.println("Name " + data.get(i).getProductName() + "\tSerial " + data.get(i).getSerial());
                }
            });

            tableProducts.setEditable(true);
            tableProducts.getColumns().addAll(serial, productName);
            tableProducts.setItems(data);

            VBox root = new VBox(tableProducts, button);
            Scene scene = new Scene(root);

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

        public class Products
        {
            private final SimpleStringProperty Serial;
            private final SimpleStringProperty ProductName;

            public Products(String serial, String productName)
            {
                this.Serial = new SimpleStringProperty(serial);
                this.ProductName = new SimpleStringProperty(productName);
            }

            public void setSerial(String serial)
            {
                Serial.set(serial);
            }

            public String getSerial()
            {
                return Serial.get();
            }

            public void setProductName(String productName)
            {
                ProductName.set(productName);
            }

            public String getProductName()
            {
                return ProductName.get();
            }
        }
    }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...