Есть ли способ предотвратить потерю редактирования значений в динамическом табличном представлении javafx при прокрутке - PullRequest
1 голос
/ 13 мая 2019

У меня есть табличное представление javafx с динамическими столбцами в том смысле, что столбцы добавляются во время выполнения.Я не использую какой-либо класс модели, и данные заполняются через наблюдаемый список.После начальной загрузки таблицы с данными все в порядке, проблема возникает, когда я прокручиваю таблицу, загружаются начальные значения таблицы или, если таблица была пустой, все данные, которые я ввел, очищаются.Вот мой код

это мое соединение

public  Connection conn;

TableColumn tc = null;
TableView <ObservableList> table = new TableView<>();

ObservableList items;

public  Connection dbcon() {

    try {

        String url ="jdbc:mysql://localhost:3306/"; //koma //emerald

        conn = DriverManager.getConnection(url, "root", "walgotech");
        String createdb = "CREATE DATABASE IF NOT EXISTS `school`";
        PreparedStatement pst = conn.prepareStatement(createdb);
        pst.execute();
        Statement stt = conn.createStatement();
        stt.execute("use school");
    } catch (Exception e) {
        e.printStackTrace();
    }

    return conn;

}  

, тогда это метод запуска, где я загружаю данные изначально

    public void start(Stage primaryStage) {
    StackPane root = new StackPane();
     table.setEditable(true);

     try{
         items = FXCollections.observableArrayList();
        items.clear();

         dbcon();

         List<String> sql1 = new ArrayList<String>();       

            ResultSet mk111 = conn.prepareStatement("SELECT *  FROM `subjects1` ORDER BY `ORDER` ASC").executeQuery();;
            while(mk111.next()){

                 sql1.add("`"+mk111.getString("code")+"`");

                }
            String formattedString1 = sql1.toString()
                    .replace("[", "")  
                    .replace("]", "") 
                    .trim();

         ResultSet rs =conn.prepareStatement("SELECT `form4 term1 mid-term exam 2019`."
                + "admno,CONCAT(`FIRST NAME`,' ',`SECOND NAME`)"
                + " AS Studentname,"+formattedString1+""
                    + ",`form4 term1 mid-term exam 2019`.Total FROM `form4 term1 mid-term exam 2019` "
                    + "INNER JOIN  registration on `form4 term1 mid-term exam 2019`."
                    + "admno=registration.`ADM NO` GROUP BY `form4 term1 mid-term exam 2019`.admno ").executeQuery();   



         for(int i=0 ; i<rs.getMetaData().getColumnCount(); i++){   

              final int j = i;

        tc = new TableColumn <>(rs.getMetaData().getColumnName(i+1));

         tc.setEditable(true);



        tc.setCellFactory(column -> new EditCell1(null));

        tc.setPrefWidth(90);


        tc.setCellValueFactory(new Callback<CellDataFeatures<ObservableList,String>,ObservableValue<String>>(){                    
              public ObservableValue<String> call(CellDataFeatures<ObservableList, String> param) {                                                                                              
                  return new SimpleStringProperty(param.getValue().get(j).toString());                        
              }                    
          });
             table.getColumns().addAll(tc); 
    }


         while(rs.next()){

               ObservableList<String> row = FXCollections.observableArrayList();
              for(int i=1 ; i<=rs.getMetaData().getColumnCount(); i++){

                  row.add(rs.getString(i));

              }
              items.add(row);

          }
         table.setItems(items);



    table.setOnKeyPressed(event -> {
        TablePosition<ObservableList, ?> pos = table.getFocusModel().getFocusedCell() ;
        if (pos != null) {
            table.edit(pos.getRow(), pos.getTableColumn());
        }
    });     



    root.getChildren().add(table);
    primaryStage.setScene(new Scene(root, 300, 250));
    primaryStage.show();

} catch (Exception e1) {
    e1.printStackTrace();
    } 
}

Следующий класс и методыдля редактирования ячеек.Начните редактирование, подтвердите редактирование и отмените.

private  class EditCell1 extends TableCell<ObservableList, String> {

    private final TextField textField = new TextField();
    private final Function<ObservableList, StringProperty> property ;

    @SuppressWarnings("unchecked")
    EditCell1(Function<ObservableList, StringProperty> property) {
        this.property = property ;

        textProperty().bind(itemProperty());
        setGraphic(textField);
        setContentDisplay(ContentDisplay.TEXT_ONLY);

        textField.requestFocus();          


        textField.setOnAction(evt -> {
            commitEdit(textField.getText());            

        });


        textField.setOnKeyPressed(new EventHandler(){
            @Override
            public void handle(Event arg0) {



            }           
        });


    }




    @Override
    public void startEdit() {
        super.startEdit();
        textField.setText(getItem());
        setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
        textField.requestFocus();          
    }






    @Override
    public void cancelEdit() {
        super.cancelEdit();
        setContentDisplay(ContentDisplay.TEXT_ONLY);
    }





    @Override
    public void commitEdit(String text) {
        super.commitEdit(text);


         { 

        final ObservableList<TablePosition> selectedCells = table.getSelectionModel().getSelectedCells();
                for (TablePosition pos : selectedCells) {                       

                String examvalue=textField.getText();                   

                 System.out.println(examvalue+" where admno="+table.getColumns().get(0).getCellObservableValue(pos.getRow()).getValue());

                  table.getSelectionModel().selectBelowCell();

                }


         }  

        setContentDisplay(ContentDisplay.TEXT_ONLY);
    }




}
...