Выберите значение в поле со списком - PullRequest
0 голосов
/ 19 сентября 2019

У меня странная проблема в моем приложении 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);

    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...