通过AddButton保存添加到TableView的项目?

时间:2016-04-25 14:19:05

标签: java javafx

我是Java的新手,我只是尝试不同的小东西。在下面的代码中,我已经设置了一个ListView,我可以通过AddButton添加新项目。

  1. 现在我想知道如何在我的程序中保存那些手动添加的项目,以便下次运行代码时,不仅代码中的默认项目1-5,而且我手动的项目添加到我的表中?我想我需要构建一些外部库,其中保存手动添加的项目并在每次重新运行代码时加载它?

  2. 另外,如何通过单击删除来启用标记和删除多个项目?

  3. 是否还有另一种更详细的方式来编写此代码 selectedProducts.forEach(allProducts :: remove); 以查看此处发生的背景?

  4. public class Main extends Application {     
    
        public static void main(String[] args) {
            launch(args);                               
        }
    
        @Override                                                  
        public void start(Stage stage) throws Exception {     
    
            //BAUSTEINE - Eingabefeld:
            TextField nameInput = new TextField();
            nameInput.setMinWidth(100);
            nameInput.setPromptText("Name");
    
            TextField priceInput = new TextField();
            priceInput.setMinWidth(100);
            priceInput.setPromptText("Price");
    
            TextField quantityInput = new TextField();
            quantityInput.setMinWidth(100);
            quantityInput.setPromptText("Quantity");
    
    
            //BAUSTEINE - Tabelle:
            TableColumn<Product, String> nameSpalte = new TableColumn<>();          
            nameSpalte.setText("Name");                                             
            nameSpalte.setMinWidth(200);                                            
            nameSpalte.setCellValueFactory(new PropertyValueFactory<>("Name"));     
            TableColumn<Product, Double> priceSpalte = new TableColumn<>();
            priceSpalte.setText("Price");
            priceSpalte.setMinWidth(200);
            priceSpalte.setCellValueFactory(new PropertyValueFactory<>("price"));
    
            TableColumn<Product, String> quantitySpalte = new TableColumn<>();
            quantitySpalte.setText("Quantity");
            quantitySpalte.setMinWidth(200);
            quantitySpalte.setCellValueFactory(new PropertyValueFactory<>("quantity"));  
    
            TableView<Product> tabelle = new TableView<Product>();                  
            tabelle.getColumns().addAll(nameSpalte, priceSpalte, quantitySpalte);   
            tabelle.setItems(getProduct());                                         
    
    
    
            //BAUSTEINE - Buttons:
            Button addButton = new Button("Add");
            addButton.setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent event) {                     
                    Product product = new Product();
                    product.setName(nameInput.getText());                           
                    product.setPrice(Double.parseDouble(priceInput.getText()));     
                    product.setQuantity(Integer.parseInt(quantityInput.getText())); 
                    tabelle.getItems().addAll(product);                             
                    nameInput.clear();                                              
                    priceInput.clear();                                             
                    quantityInput.clear();                                          
                }
            });
    
            Button deleteButton = new Button("Delete");                             
            deleteButton.setOnAction(new EventHandler<ActionEvent>() {
                public void handle(ActionEvent event) {
                    ObservableList<Product> allProducts = tabelle.getItems();       
                    ObservableList<Product> selectedProducts = tabelle.getSelectionModel().getSelectedItems();  
                    selectedProducts.forEach(allProducts:: remove);
                }
            });
    
    
            //LAYOUT:
            HBox hBox = new HBox();
            hBox.setPadding(new Insets(10,10,10,10));
            hBox.setSpacing(10);
            hBox.getChildren().addAll(nameInput, priceInput, quantityInput, addButton, deleteButton);
    
            VBox vBox = new VBox();
            vBox.getChildren().addAll(tabelle, hBox);
    
            //EIGENSCHAFTEN DER SCENE:
            Scene scene = new Scene(vBox);
    
            //EIGENSCHAFTEN DER STAGE:
            stage.setScene(scene);
    
            //PROGRAMMSTART:
            stage.show();   
        }
    
        public ObservableList<Product> getProduct() {                                   
            ObservableList<Product> products = FXCollections.observableArrayList();     
            products.add(new Product("Item 1", 859.00, 20));
            products.add(new Product("Item 2", 2.49, 198));
            products.add(new Product("Item 3", 99.00, 74));
            products.add(new Product("Item 4", 19.99, 12));
            products.add(new Product("Item 5", 1.49, 856));
            return products;                                            
        }
    
    }
    

1 个答案:

答案 0 :(得分:0)

  1. 这个论坛的问题可能太宽泛了。你需要决定 如何以持久格式表示产品。它 可以在您定义的文本格式的平面文件中(在这种情况下) 你只需要使用标准java.io类来读写 他们可以使用Java序列化(再次使用标准 java.io;请注意,这些日子并不是很受欢迎 它很容易让它工作,让它工作起来可能很棘手 好)。您可以使用标准格式(如JSON或XML)并使用 一个图书馆(如杰克逊或谷歌GSON)来整理/解组你的 这种格式的产品。或者你可以使用关系数据库和 用于读取/写入数据库的JDBC或JPA。 (一旦你决定了你想要它们的代表,试试一个实现并发布具体的问题,如果你被困住了。)
  2. 使用tabelle.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
  3. 您当前的代码基本上等同于

    for (Product p : selectedProducts) {
        allProducts.remove(p);
    }
    

    请注意,这有点脆弱,因为从列表中移除项目可能导致重置所选项目(取决于选择模型的实现等),在这种情况下,坏事情当您尝试迭代正在更改的列表时,将会发生这种情况。将所选项目复制到新列表可能更好:

    List<Product> selectedItems = new ArrayList<>(tabelle.getSelctionModel().getSelectedItems());
    for (Product p : selectedItems) {
        allProducts.remove(p);
    }
    

    并注意到还有:

    List<Product> selectedItems = new ArrayList<>(tabelle.getSelctionModel().getSelectedItems());
    allProducts.removeAll(selectedItems);