Возникли проблемы при настройке табличных значений из базы данных в JavaFX - PullRequest
0 голосов
/ 08 марта 2020

Я пытаюсь настроить свою таблицу так, чтобы я мог получить значения базы данных и установить их для столбцов таблицы, но он отказывается заполнять таблицу. Существует конкретная ошибка, которая отображается, и сама ошибка говорит

incompatible types: PropertyValueFactory<Object,Object> cannot be converted to Callback<CellDataFeatures<CAP#1,CAP#2>,ObservableValue<CAP#2>>

Вот мой код

AnchorPane AnchorPane;
    Connection connection;
    String url = "jdbc:sqlserver://localhost:1433;databaseName=Charis;username=sa;password=";

        @FXML
        TableView <Stock> tblStockTake;
    @FXML
    TableColumn <?,?> colStockTakeBy;
    @FXML
    TableColumn<?,?> colNumberOfPurple;
    @FXML
    TableColumn<?,?> colNumberOfGold;
    @FXML
    TableColumn<?,?> colDate;
    ObservableList <Stock> data;


    @FXML
    TextField txtNumberOfSilver,txtNumberOfPurple,txtProductName,txtStockTakeBy;
    @FXML
    Button btnAddStock,btnUpdateStock,btnClearFields;
    StockTakeHandler handler;

    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO
        animate();
        handler = new StockTakeHandler();
        data = FXCollections.observableArrayList();
        getDataFromDatabase();
        setCellTable();

    }   

    @FXML
    public void addStock(ActionEvent event){

       //add stock to the database

        if(txtNumberOfSilver.getText().equals("")
                ||txtNumberOfPurple.getText().equals("")
                ||txtProductName.getText().equals("")
                ||txtStockTakeBy.getText().equals("")){

           showMessage();

        }else{

           //get the id number

            String productName = txtProductName.getText().toString();
            String stockTakeBy = txtStockTakeBy.getText().toString();
            int numberOfPurple = Integer.parseInt(txtNumberOfSilver.getText().toString());
            int numberOfSilver = Integer.parseInt(txtNumberOfPurple.getText().toString());
            handler.addStockToDatabase(productName, stockTakeBy, numberOfPurple,numberOfSilver);
            clearFields();

        }


    }
    @FXML
    public void clearFields(){
        //FXML txtNumberOfSilver,txtNumberOfPurple,txtProductName,txtStockTakeBy;
        txtNumberOfSilver.setText("");
        txtStockTakeBy.setText("");
        txtNumberOfPurple.setText("");
        txtNumberOfSilver.setText("");
    }


    private void showMessage() {

        //check if there are any empty fields
        JOptionPane.showMessageDialog(null,"Please Check For Empty Fields");

    }

    @FXML
    public void updateStock(ActionEvent event){

             if(txtNumberOfSilver.getText().equals("")
                ||txtNumberOfPurple.getText().equals("")
                ||txtProductName.getText().equals("")
                ||txtStockTakeBy.getText().equals("")){

           showMessage();

        }else{

            String productName = txtProductName.getText().toString();
            String stockTakeBy = txtStockTakeBy.getText().toString();
            int numberOfPurple = Integer.parseInt(txtNumberOfSilver.getText().toString());
            int numberOfSilver = Integer.parseInt(txtNumberOfPurple.getText().toString());
            handler.updateStockInDatabase(productName, stockTakeBy, numberOfPurple,numberOfSilver);
            clearFields();
    }


}

    private void getDataFromDatabase() {

    data.clear();

        try {
            Class.forName("com.microsoft.sqlserver.jdbc.SQLServerDriver");
            connection = DriverManager.getConnection(url);
            String sql = "select * from StockTake";

            Statement statement = connection.createStatement();

            ResultSet rSet = statement.executeQuery(sql);

            while(rSet.next()) {


                String productName = rSet.getString("productName");
                String stockTakeBy = rSet.getString("stockTakeBy") + "";
                String numberOfPurple= rSet.getString("numberOfPurple") + "";
                                String numberOfGold = rSet.getString("numberOfGold") + "";
                String currentDate = rSet.getString("currentDate") + "";

                                System.out.println(productName);

                Stock list = new Stock(productName,stockTakeBy,numberOfPurple,numberOfGold,currentDate);

                data.add(list);

                }

            tblStockTake.setItems(data);

        } catch (ClassNotFoundException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SQLException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();

        }
    }


    private void setCellTable() {

     colStockTakeBy.setCellValueFactory(new PropertyValueFactory<>("productName"));
    /*colNumberOfPurple.setCellValueFactory(new PropertyValueFactory<>("itemDescription"));
    colNumberOfGold.setCellValueFactory(new PropertyValueFactory<>("supplierCode"));
    colDate.setCellValueFactory(new PropertyValueFactory<>("date"));**/

       }

1 Ответ

0 голосов
/ 08 марта 2020

Вы используете подстановочные знаки для аргументов типа для каждого TableColumn. Затем позже аргументы типа вашего PropertyValueFactory выводятся как Object. Другими словами, у вас есть:

TableColumn<?, ?> col = ...;
col.setCellValueFactory(new PropertyValueFactory<Object, Object>("..."));`

И в этом заключается проблема: Object != ?. Вы должны заменить символы подстановки настоящими типами. Например:

// all type arguments are just a guess based on field name
@FXML TableColumn<Stock, LocalDate> colStockTakeBy;
@FXML TableColumn<Stock, Number> colNumberOfPurple;
@FXML TableColumn<Stock, Number> colNumberOfGold;
@FXML TableColumn<Stock, LocalDate> colDate;

Первый аргумент типа должен соответствовать аргументу типа TableView, которому принадлежит TableColumn. Второй тип аргумента должен быть типом, который будут отображать ячейки этого столбца.


В качестве отступления, в этом методе:

private void showMessage() {

    //check if there are any empty fields
    JOptionPane.showMessageDialog(null,"Please Check For Empty Fields");

}

Вы используете класс из Swing API: JOptionPane. За исключением случаев, когда это абсолютно необходимо, избегайте смешивания различных наборов инструментов пользовательского интерфейса. В противном случае это добавляет ненужную сложность и может привести к трудным для диагностики ошибкам. Вместо этого вы должны использовать эквивалентный JavaFX API - см. Alert.

private void showMessage() {
  Alert alert = new Alert(AlertType.ERROR);
  alert.initOwner(tblStockTake.getScene().getWindow());
  alert.setHeaderText(null);
  alert.setContentText("Please check for empty fields.");
  alert.showAndWait();
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...