У меня странная проблема в моем приложении javafx, с которым я сейчас работаю. Не могу понять, что происходит, в моем приложении я реализовал табличное представление, когда пользователь нажимает на строку таблицы, это должно заполнить форум вслева (см. скриншоты) я реализовал эту функцию, добавив событие.с этой реализацией все работает отлично, за исключением двух полей со списком, когда я выбираю строку в первый раз, она не обновляет поля со списком, но когда я выбираю строку во второй раз, она обновляется без каких-либо проблем.
, так как Java 11 не поддерживает должным образом текст подсказки в нередактируемом комбинированном ящике. Я использую фиктивную модель в качестве текста подсказки, может ли это быть проблемой ??
Снимок экрана привыбор в первый раз
Снимок экрана при выборе во второй раз
Это класс продукта
public class Product {
private int pid;
private String name;
private Double price;
private Brand brand;
private Category category;
private int qty;
public Product() {
}
public Product(int pid, String name, Double price, Brand brand, Category category, int qty) {
this.pid = pid;
this.name = name;
this.price = price;
this.brand = brand;
this.category = category;
this.qty = qty;
}
public int getPid() {
return pid;
}
public void setPid(int pid) {
this.pid = pid;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Double getPrice() {
return price;
}
public void setPrice(Double price) {
this.price = price;
}
public Brand getBrand() {
return brand;
}
public void setBrand(Brand brand) {
this.brand = brand;
}
public Category getCategory() {
return category;
}
public void setCategory(Category category) {
this.category = category;
}
public int getQty() {
return qty;
}
public void setQty(int qty) {
this.qty = qty;
}
}
Это класс категории
public class Category {
private int id;
private String name;
private String status;
public Category(int id, String name, String status) {
this.id = id;
this.name = name;
this.status = status;
}
public Category( String name, String status) {
this.name = name;
this.status = status;
}
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public String getStatus() {
return status;
}
public void setStatus(String status) {
this.status = status;
}
public boolean isActive(){
return status.equals("Available");
}
@Override
public String toString() {
return getName();
}
}
И это класс моего контроллера
import java.io.IOException;
import java.net.URL;
import java.util.ResourceBundle;
import java.util.function.UnaryOperator;
public class InventoryController implements Initializable {
@FXML
TableView<Product> product_table;
@FXML
TableColumn<Product, Integer> pidColumn;
@FXML
TableColumn<Product, Integer> nameColumn;
@FXML
TableColumn<Product, Integer> priceColumn;
@FXML
TableColumn<Product, Integer> brandColumn;
@FXML
TableColumn<Product, Integer> categoryColumn;
@FXML
TableColumn<Product, Integer> qtyColumn;
@FXML
Label statusLbl;
@FXML
TextField pidTF;
@FXML
ComboBox<Brand> brandCB;
@FXML
ComboBox<Category> categoryCB;
@FXML
TextField nameTF;
@FXML
TextField priceTF;
@FXML
TextField qtyTF;
private ProductManagerService productManagerService;
@Override
public void initialize(URL location, ResourceBundle resources) {
pidColumn.setCellValueFactory(new PropertyValueFactory<>("pid"));
nameColumn.setCellValueFactory(new PropertyValueFactory<>("name"));
priceColumn.setCellValueFactory(new PropertyValueFactory<>("price"));
brandColumn.setCellValueFactory(new PropertyValueFactory<>("brand"));
categoryColumn.setCellValueFactory(new PropertyValueFactory<>("category"));
qtyColumn.setCellValueFactory(new PropertyValueFactory<>("qty"));
UnaryOperator<TextFormatter.Change> integerFilter = change -> {
String newText = change.getControlNewText();
if (newText.matches("([1-9][0-9]*)?")) {
return change;
}
return null;
};
UnaryOperator<TextFormatter.Change> doubleFilter = change -> {
String newText = change.getControlNewText();
if (newText.matches("\\d*|\\d+\\.\\d*")) {
return change;
}
return null;
};
pidTF.setTextFormatter(
new TextFormatter<Integer>(new IntegerStringConverter(), null, integerFilter));
priceTF.setTextFormatter(
new TextFormatter<Double>(new DoubleStringConverter(), null, doubleFilter));
qtyTF.setTextFormatter(
new TextFormatter<Integer>(new IntegerStringConverter(), null, integerFilter));
productManagerService = new ProductManagerService();
loadData();
loadBrands();
loadCategories();
product_table.getSelectionModel().selectedItemProperty().addListener((obs, oldSelection, newSelection) -> {
if (newSelection != null) {
Product product = product_table.getSelectionModel().getSelectedItem();
pidTF.setText(String.valueOf(product.getPid()));
nameTF.setText(product.getName());
priceTF.setText(String.valueOf(product.getPrice()));
brandCB.getSelectionModel().select(product.getBrand());
categoryCB.getSelectionModel().select(product.getCategory());
qtyTF.setText(String.valueOf(product.getQty()));
}
});
}
private void loadData() {
ObservableList<Product> products = productManagerService.getProductsList();
if (products == null) {
System.out.println("No Products");
} else {
product_table.setItems(products);
}
}
private void loadBrands() {
BrandManagerService brandManagerService = new BrandManagerService();
ObservableList<Brand> brands = brandManagerService.getBrandsList();
/*This model will work as a prompt text for combo Box
Java 11 Doesnt properly support prompt text on Non Editable ComboBox.
*/
Brand promtText = new Brand("Select Product Brand", null);
brandCB.getItems().add(0, promtText);
brandCB.getSelectionModel().select(0);
for (Brand brand : brands) {
if (brand.isActive())
brandCB.getItems().add(brand);
}
}
private void loadCategories() {
CategoryManagerService categoryManagerService = new CategoryManagerService();
ObservableList<Category> categories = categoryManagerService.getCategoriesList();
/*This model will work as a prompt text for combo Box
Java 11 Doesnt properly support prompt text on Non Editable ComboBox
*/
Category promtText = new Category("Select Product Category", null);
categoryCB.getItems().add(0, promtText);
categoryCB.getSelectionModel().select(0);
for (Category category : categories) {
if (category.isActive()) {
categoryCB.getItems().add(category);
}
}
}
@FXML
public void add() {
if (valid()) {
int pid = Integer.parseInt(pidTF.getCharacters().toString());
String name = nameTF.getCharacters().toString();
Double price = Double.parseDouble(priceTF.getCharacters().toString());
Brand brand = brandCB.getSelectionModel().getSelectedItem();
Category category = categoryCB.getSelectionModel().getSelectedItem();
int qty = Integer.parseInt(qtyTF.getCharacters().toString());
Product product = new Product(pid, name, price, brand, category, qty);
if (productManagerService.addProduct(product)) {
clearData();
loadData();
} else {
Alert alert = new Alert(Alert.AlertType.ERROR,
"Product ID Already Exists In the System ! Use a Unique Id !", ButtonType.OK);
alert.initStyle(StageStyle.UTILITY);
alert.showAndWait();
}
} else {
Alert alert = new Alert(Alert.AlertType.ERROR,
"Please Provide Valid Information !", ButtonType.OK);
alert.initStyle(StageStyle.UTILITY);
alert.showAndWait();
}
}
@FXML
private void delete() {
Product product = product_table.getSelectionModel().getSelectedItem();
Alert alert = new Alert(Alert.AlertType.CONFIRMATION,
"Are you sure You Want to delete this Product from System ?", ButtonType.YES, ButtonType.NO, ButtonType.CANCEL);
alert.initStyle(StageStyle.UTILITY);
alert.showAndWait();
if (alert.getResult() == ButtonType.YES) {
productManagerService.removeProduct(product.getPid());
loadData();
clearData();
}
}
@FXML
public void update() {
if (valid()) {
int pid = Integer.parseInt(pidTF.getCharacters().toString());
String name = nameTF.getCharacters().toString();
Double price = Double.parseDouble(priceTF.getCharacters().toString());
Brand brand = brandCB.getSelectionModel().getSelectedItem();
Category category = categoryCB.getSelectionModel().getSelectedItem();
int qty = Integer.parseInt(qtyTF.getCharacters().toString());
if (!product_table.getSelectionModel().isEmpty()){
int pidSelected = product_table.getSelectionModel().getSelectedItem().getPid();
Product product = new Product(pid, name, price, brand, category, qty);
if (productManagerService.updateProduct(product,pidSelected)) {
clearData();
loadData();
} else {
Alert alert = new Alert(Alert.AlertType.ERROR,
"Product ID Already Exists In the System ! Use a Unique Id !", ButtonType.OK);
alert.initStyle(StageStyle.TRANSPARENT);
alert.showAndWait();
}
}else {
Alert alert = new Alert(Alert.AlertType.ERROR,
"Please Select a Product To Update!", ButtonType.OK);
alert.initStyle(StageStyle.TRANSPARENT);
alert.showAndWait();
}
} else {
Alert alert = new Alert(Alert.AlertType.ERROR,
"Please Provide Valid Information !", ButtonType.OK);
alert.initStyle(StageStyle.UTILITY);
alert.showAndWait();
}
}
@FXML
public void clear(){
clearData();
}
private void clearData() {
nameTF.clear();
priceTF.clear();
qtyTF.clear();
pidTF.clear();
brandCB.getSelectionModel().select(0);
categoryCB.getSelectionModel().select(0);
}
private boolean valid() {
return !(nameTF.getCharacters().length() == 0
|| pidTF.getCharacters().length() == 0
|| priceTF.getCharacters().length() == 0
|| qtyTF.getCharacters().length() == 0
|| brandCB.getSelectionModel().getSelectedIndex() == 0
|| categoryCB.getSelectionModel().getSelectedIndex() == 0
);
}
public void openManageCategoryBrands(ActionEvent event) throws IOException {
Parent viewParent = FXMLLoader.load(getClass().getResource("/view/categories_and_brands.fxml"));
Stage windowstage = (Stage) ((Node) event.getTarget()).getScene().getWindow();
windowstage.setScene(new Scene(viewParent, 1280, 720));
windowstage.centerOnScreen();
windowstage.setTitle("Manage Product Brands and Categories");
Image icon = new Image(MainController.class.getResource("/res/icons/warehouse.png").toExternalForm(), false);
windowstage.getIcons().add(icon);
}
@FXML
public void openHomeScene(ActionEvent event) throws IOException {
Parent viewParent = FXMLLoader.load(getClass().getResource("/view/home.fxml"));
Stage windowstage = (Stage) ((Node) event.getTarget()).getScene().getWindow();
windowstage.setScene(new Scene(viewParent, 840, 473));
windowstage.centerOnScreen();
windowstage.setTitle("Store Management Nisha Electricals PVC");
Image icon = new Image(MainController.class.getResource("/res/icons/icon.png").toExternalForm(), false);
windowstage.getIcons().add(icon);
}
}