我是Java的新手,我只是尝试不同的小东西。在下面的代码中,我已经设置了一个ListView,我可以通过AddButton添加新项目。
现在我想知道如何在我的程序中保存那些手动添加的项目,以便下次运行代码时,不仅代码中的默认项目1-5,而且我手动的项目添加到我的表中?我想我需要构建一些外部库,其中保存手动添加的项目并在每次重新运行代码时加载它?
另外,如何通过单击删除来启用标记和删除多个项目?
是否还有另一种更详细的方式来编写此代码 selectedProducts.forEach(allProducts :: remove); 以查看此处发生的背景?
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;
}
}
答案 0 :(得分:0)
java.io
类来读写
他们可以使用Java序列化(再次使用标准
java.io
;请注意,这些日子并不是很受欢迎
它很容易让它工作,让它工作起来可能很棘手
好)。您可以使用标准格式(如JSON或XML)并使用
一个图书馆(如杰克逊或谷歌GSON)来整理/解组你的
这种格式的产品。或者你可以使用关系数据库和
用于读取/写入数据库的JDBC或JPA。 (一旦你决定了你想要它们的代表,试试一个实现并发布具体的问题,如果你被困住了。)tabelle.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
您当前的代码基本上等同于
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);