Как решить ошибку несоответствия типов при событии onEditCommit?

#java #javafx-8

#java #javafx-8

Вопрос:

Я использовал событие onEditCommit в Fxml для повторного просмотра данных после их редактирования пользователем.

Код FXML -:

 <TableColumn editable="true" maxWidth="5000.0" minWidth="10.0" onEditCancel="#editEnd_0" onEditStart="#editStart_0" onEditCommit="#editCommit_0" prefWidth="136.0" text="Description Of Goods" fx:id="value_0" />
  

Реализовано событие onEditCommit -:

 public void editCommit_0(CellEditEvent<Record,String> event) 
    {

        System.out.println("Value edited: On edit new value is " event.getNewValue());
    }
  

Ошибка -:

 Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: argument type mismatch
    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.reflect.misc.Trampoline.invoke(MethodUtil.java:71)
    at sun.reflect.GeneratedMethodAccessor2.invoke(Unknown Source)
    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
    at java.lang.reflect.Method.invoke(Method.java:483)
    at sun.reflect.misc.MethodUtil.invoke(MethodUtil.java:275)
    at javafx.fxml.FXMLLoader$MethodHandler.invoke(FXMLLoader.java:1763)
    at javafx.fxml.FXMLLoader$ControllerMethodEventHandler.handle(FXMLLoader.java:1651)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:49)
    at javafx.event.Event.fireEvent(Event.java:204)
    at javafx.scene.control.TableCell.commitEdit(TableCell.java:335)
    at javafx.scene.control.cell.CellUtils$4.handle(CellUtils.java:252)
    at javafx.scene.control.cell.CellUtils$4.handle(CellUtils.java:243)
    at com.sun.javafx.event.CompositeEventHandler.dispatchBubblingEvent(CompositeEventHandler.java:86)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:238)
    at com.sun.javafx.event.EventHandlerManager.dispatchBubblingEvent(EventHandlerManager.java:191)
    at com.sun.javafx.event.CompositeEventDispatcher.dispatchBubblingEvent(CompositeEventDispatcher.java:59)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:58)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.BasicEventDispatcher.dispatchEvent(BasicEventDispatcher.java:56)
    at com.sun.javafx.event.EventDispatchChainImpl.dispatchEvent(EventDispatchChainImpl.java:114)
    at com.sun.javafx.event.EventUtil.fireEventImpl(EventUtil.java:74)
    at com.sun.javafx.event.EventUtil.fireEvent(EventUtil.java:54)
    at javafx.event.Event.fireEvent(Event.java:204)
    at javafx.scene.Scene$KeyHandler.process(Scene.java:3949)
    at javafx.scene.Scene$KeyHandler.access$2100(Scene.java:3896)
    at javafx.scene.Scene.impl_processKeyEvent(Scene.java:2036)
    at javafx.scene.Scene$ScenePeerListener.keyEvent(Scene.java:2493)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:170)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler$KeyEventNotification.run(GlassViewEventHandler.java:123)
    at java.security.AccessController.doPrivileged(Native Method)
    at com.sun.javafx.tk.quantum.GlassViewEventHandler.handleKeyEvent(GlassViewEventHandler.java:197)
    at com.sun.glass.ui.View.handleKeyEvent(View.java:517)
    at com.sun.glass.ui.View.notifyKey(View.java:927)
    at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
    at com.sun.glass.ui.win.WinApplication.access$300(WinApplication.java:39)
    at com.sun.glass.ui.win.WinApplication$4$1.run(WinApplication.java:112)
    at java.lang.Thread.run(Thread.java:745)
  

Полный Код -:

 Controller.java

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.techi.calco.transaction.controller;

import com.techi.calco.Main;
import com.techi.calco.model.ItemGroup;
import com.techi.calco.util.EditingCell;
import com.techi.calco.model.Record;
import com.techi.calco.service.ItemService;
import com.techi.calco.util.ButtonCell;
import java.net.URL;
import java.util.Random;
import java.util.ResourceBundle;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleBooleanProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.value.ObservableValue;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.ActionEvent;
import javafx.fxml.FXML;
import javafx.fxml.Initializable;
import javafx.scene.control.Button;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.TreeTableColumn.CellEditEvent;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;
import javafx.util.Callback;
import np.com.ngopal.control.AutoFillTextBox;


/**
 * FXML Controller class
 *
 * @author Vipin Bhatt
 */
public class SaleInvoiceController implements Initializable {


  public  static  ObservableList<Record> data = FXCollections.observableArrayList();
 //public  static  ObservableList<String> data = FXCollections.observableArrayList();



  // Implemented 25 6
     ObservableList<String> data5;
     private ObservableList<ItemGroup>  data2 = FXCollections.observableArrayList();

     ItemService itemService =  itemService=(ItemService)Main.applicationContext.getBean("itemService");


    private ObservableList<ItemGroup> vatData = FXCollections.observableArrayList();


    String[] smooth;
    String[] items;
    static int  sk5;

     @FXML
    private TableView<Record>  tableView ;
     //private TableView<String>  tableView ;


     @FXML
     private AutoFillTextBox autoFill;

     @FXML
     private  Button addNew,btnNew;

     static Random random = new Random();

     @FXML
     //private  TableColumn  col_id,value_0,value_1,value_2,value_3,value_4 ,col_Action,sale_invoiceNo;
    private TableColumn<Record, String> col_id,value_0,value_1,value_2,value_3,value_4 ,col_Action,sale_invoiceNo;

      //index for delete Item  
   private IntegerProperty index = new SimpleIntegerProperty();

    /**
     * Initializes the controller class.
     */
    @Override
    public void initialize(URL url, ResourceBundle rb) {
        // TODO

            System.out.println("Get text saleinvoice--->" btnNew.getText());
          tableView.setEditable(true);


         index.set(-1);



           Callback<TableColumn, TableCell> cellFactory =
                new Callback<TableColumn, TableCell>() 
                {

                    @Override
                    public TableCell call(TableColumn p) {
                        return new EditingCell();
                    }
                };


          // searchAction("a");



          col_id.setCellValueFactory(new PropertyValueFactory<Record, String>("id"));
            //col_id.setCellValueFactory(new PropertyValueFactory<String, String>("id"));

          value_0.setCellValueFactory(new PropertyValueFactory<Record, String>("value_0"));
            //value_0.setCellValueFactory(new PropertyValueFactory<String, String>("value_0"));

            //value_0.setCellValueFactory(new PropertyValueFactory<ItemService, String>("itemGroupName"));


            //value_1.setCellValueFactory(new PropertyValueFactory<Record, Integer>("value_1"));
           // value_2.setCellValueFactory(new PropertyValueFactory<Record, String>("value_2"));
            //value_3.setCellValueFactory(new PropertyValueFactory<Record, String>("value_3"));
            //value_4.setCellValueFactory(new PropertyValueFactory<Record, String>("value_4"));


                 System.out.println("ngettiing Cell value factore-:"  value_0.getCellValueFactory());


        /*
            col_Action.setCellValueFactory(
                new Callback<TableColumn.CellDataFeatures<Record, Boolean>, 
                ObservableValue<Boolean>>() {

            @Override
            public ObservableValue<Boolean> call(TableColumn.CellDataFeatures<Record, Boolean> p) {
                return new SimpleBooleanProperty(p.getValue() != null);
            }


        });

        col_Action.setCellFactory(
                new Callback<TableColumn<Record, Boolean>, TableCell<Record, Boolean>>() {

            @Override
            public TableCell<Record, Boolean> call(TableColumn<Record, Boolean> p) {
                return new ButtonCell();
            }

        });

           */

            //value_0.setCellFactory(cellFactory);
            //value_1.setCellFactory(cellFactory);
            //value_2.setCellFactory(cellFactory);
            //value_3.setCellFactory(cellFactory);

            value_0.setCellFactory(TextFieldTableCell.forTableColumn()) ;
            //value_1.setCellFactory(TextFieldTableCell.forTableColumn()) ;
           // value_2.setCellFactory(TextFieldTableCell.forTableColumn()) ;
            //value_3.setCellFactory(TextFieldTableCell.forTableColumn()) ;


               tableView.setItems(data);



       searchAction("a");
     }    



    //Implemented 25 6

      public String searchAction(String value)
    {

        System.out.println("Inside searchAction() SaleInvoiceController inside transaction.controller->" itemService);
       //itemService = new ItemService();
       data2=itemService.searchAction(value);


       String quick = data2.get(0).getItemGroupName();
       System.out.println("Checking quick ->" quick);

       String[] smooth = new String[data2.size()];

        for (int i=0;i<data2.size();i  ){

       //  smooth[i] = data2.get(i).getItemGroupName();
            smooth[i] = data2.get(i).getItemGroupName() "-" data2.get(i).getId();

       }



        for(String str : smooth)
        {
        System.out.println("-------" str);
       }

      data5 = FXCollections.observableArrayList(smooth);

     autoFill.setData(data5);


      //

      return value;


        /*
          data2 = itemService.searchAction(value);

        String quick = data2.get(0).getItemGroupName();
        System.out.println("Checking quick ->"   quick);

         smooth = new String[data.size()];

        for (int i = 0; i < data.size(); i  ) {

            smooth[i] = data2.get(i).getItemGroupName() "-" data2.get(i).getId();

        }

        for (String str : smooth) {
            System.out.println("-------"   str);
        }

        data5 = FXCollections.observableArrayList(smooth);

        autoFill.setData(data5);

        return value;
        */


    }



    public void editStart_0()
    {

     String  a = tableView.getSelectionModel().getSelectedItem().getValue_0();
     System.out.println("Getting Sales column data before Update -" a);

    }


    public void editEnd_0()
    {

        String  a = tableView.getSelectionModel().getSelectedItem().getValue_0();
     System.out.println("Getting Sales column data after Update -" a);
    }


    public void editCommit_0(CellEditEvent<Record,String> event) 
    {

       // System.out.println("Value edited: On edit new value is " event.getNewValue());
    }



    public void newRecord(ActionEvent event)
    {
        System.out.println("Hello Add NEw Record");
        //generate new Record with random number
            int newId = data.size() 1;


            /*
            Record newRec = new Record(
                    newId,

                    random.nextInt(100), 
                    random.nextInt(100), 
                    random.nextInt(100), 
                    random.nextInt(100), 
                   random.nextInt(100));

                   data.add(newRec);
                    */


            Record newRec = new Record(
                    newId,"ram1","ram2","ram3","ram4","ram5");



                   data.add(newRec);

            System.out.println("LIST SIZE---->" SaleInvoiceController.data.size());
    }




    public void addNew(ActionEvent event)
    {
        System.out.println("addNew");


    }



}
  

Record.java (установщик getter)

   private int id;
        private String value_0;
        private String value_1;
        private String value_2;
        private String value_3;
        private String value_4;



        public  Record(int i,String a, String b, String c, String d, String e)
        {
            this.id = i;
            this.value_0 = a;
            this.value_1 = b;
            this.value_2=c;
            this.value_3=d;
            this.value_4 = e;
        }

    /**
     * @return the id
     */
    public int getId() {
        return id;
    }

    /**
     * @param id the id to set
     */
    public void setId(int id) {
        this.id = id;
    }

    /**
     * @return the value_0
     */
    public String getValue_0() {
        return value_0;
    }

    /**
     * @param value_0 the value_0 to set
     */
    public void setValue_0(String value_0) {
        this.value_0 = value_0;
    }

    /**
     * @return the value_1
     */
    public String getValue_1() {
        return value_1;
    }

    /**
     * @param value_1 the value_1 to set
     */
    public void setValue_1(String value_1) {
        this.value_1 = value_1;
    }

    /**
     * @return the value_2
     */
    public String getValue_2() {
        return value_2;
    }

    /**
     * @param value_2 the value_2 to set
     */
    public void setValue_2(String value_2) {
        this.value_2 = value_2;
    }

    /**
     * @return the value_3
     */
    public String getValue_3() {
        return value_3;
    }

    /**
     * @param value_3 the value_3 to set
     */
    public void setValue_3(String value_3) {
        this.value_3 = value_3;
    }

    /**
     * @return the value_4
     */
    public String getValue_4() {
        return value_4;
    }

    /**
     * @param value_4 the value_4 to set
     */
    public void setValue_4(String value_4) {
        this.value_4 = value_4;
    }


}
  

Пожалуйста, помогите мне решить эту ошибку, какой тип я должен поместить в реализацию события onEditCommit.
я напечатал фабрику значений ячеек столбца

 value_0.getCellValueFactory()
  

и получил

 javafx.scene.control.cell.PropertyValueFactory@5941ae6a
  

EditingCell.java -:

 /*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */

package com.techi.calco.util;


import javafx.event.EventHandler;
import javafx.scene.chart.XYChart;
import javafx.scene.control.ContentDisplay;
import javafx.scene.control.TableCell;
import javafx.scene.control.TextField;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;

/**
 *
 * @author Vipin Bhatt
 */
/*
public class EditingCell extends TableCell<XYChart.Data, Number> {


     private TextField textField;

        public EditingCell() {}

        @Override
        public void startEdit() {

            System.out.println("StarEdit Called when");

            super.startEdit();
              System.out.println("Editing cell");
            if (textField == null) {
                createTextField();
            }

            setGraphic(textField);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            textField.selectAll();
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();

            setText(String.valueOf(getItem()));
            setContentDisplay(ContentDisplay.TEXT_ONLY);
        }

        @Override
        public void updateItem(Number item, boolean empty) {
            super.updateItem(item, empty);

            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(getString());
                    }
                    setGraphic(textField);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                } else {
                    setText(getString());
                    setContentDisplay(ContentDisplay.TEXT_ONLY);
                }
            }
        }

        private void createTextField() {
            textField = new TextField(getString());
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()*2);
            textField.setOnKeyPressed(new EventHandler<KeyEvent>() {

                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        commitEdit(Integer.parseInt(textField.getText()));
                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });
        }

        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }

}
*/

public class EditingCell extends TableCell<XYChart.Data, Number> {

        private TextField textField;

        public EditingCell() {}

        @Override
        public void startEdit() {

            super.startEdit();

            if (textField == null) {
                createTextField();
            }

            setGraphic(textField);
            setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
            textField.selectAll();
        }

        @Override
        public void cancelEdit() {
            super.cancelEdit();

            setText(String.valueOf(getItem()));
            setContentDisplay(ContentDisplay.TEXT_ONLY);
        }

        @Override
        public void updateItem(Number item, boolean empty) {
            super.updateItem(item, empty);

            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(getString());
                    }
                    setGraphic(textField);
                    setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                } else {
                    setText(getString());
                    setContentDisplay(ContentDisplay.TEXT_ONLY);
                }
            }
        }

        private void createTextField() {
            textField = new TextField(getString());
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap()*2);
            textField.setOnKeyPressed(new EventHandler<KeyEvent>() {

                @Override
                public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        commitEdit(Integer.parseInt(textField.getText()));
                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });
        }

        private String getString() {
            return getItem() == null ? "" : getItem().toString();
        }
    }
  

Комментарии:

1. Можете ли вы показать реализацию вашего класса editCell, может быть, что-то не так.

2. хорошо, вы ищете полный код класса editCell -: Я отредактировал

3. На мой взгляд, ошибка здесь: public class EditingCell extends TableCell<XYChart.Data, Number> и значение val_0 TableColumn , которое вы хотите отредактировать, вводится в TableColumn<Record, String> , поэтому вы получаете несоответствие типов от String до Number . В противном случае вы можете использовать решение @jewelsea, это сработает!

4. пожалуйста, подскажите мне, как сохранить значение TableCell в моем случае

5. это n-й вопрос, касающийся в основном той же проблемы — не похоже, что вы многому научились из предыдущих QA 😉 Перечитайте свой любимый учебник / tutorial и внимательно оцените ответы, затем сократите свой код до нескольких строк, чтобы изолировать редактирование и поиграть с ним.

Ответ №1:

Ваш тип обработчика событий выглядит нормально для меня. Я предполагаю, что несоответствие типов происходит в другом месте.

Пример

Вот пример, который демонстрирует настройку обработчика событий фиксации при использовании FXML. Прошу прощения за многословие, именно таков FXML.

Обработчик фиксации редактирования в примере является:

 @FXML
void commitValue(TableColumn.CellEditEvent<Singular, String> event) {
    System.out.println("Commit: "   event.getNewValue());
}
  

где Singluar — это просто имя класса записи, используемого в TableView для примера.

commit/CommitController.java

 import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.fxml.FXML;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableView;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.control.cell.TextFieldTableCell;

public class CommitController {

    @FXML
    private TableView<Singular> table;

    @FXML
    private TableColumn<Singular, String> value;

    @FXML
    void commitValue(TableColumn.CellEditEvent<Singular, String> event) {
        System.out.println("Commit: "   event.getNewValue());
    }

    public void initialize() {
        value.setCellFactory(TextFieldTableCell.forTableColumn());
        value.setCellValueFactory(new PropertyValueFactory<>("value"));
        value.setEditable(true);

        table.getItems().setAll(
                new Singular("enie"),
                new Singular("meenie"),
                new Singular("minie"),
                new Singular("moe"),
                new Singular("just commit!")
        );
        table.setEditable(true);
    }

    public static class Singular {
        private StringProperty value = new SimpleStringProperty();

        public Singular(String value) {
            this.value.setValue(value);
        }

        public StringProperty valueProperty() {
            return value;
        }
    }
}
  

commit/CommitmentApp.java

 import javafx.application.Application;
import javafx.fxml.FXMLLoader;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.stage.Stage;

import java.io.IOException;

public class CommitmentApp extends Application {

    @Override
    public void start(Stage stage) throws IOException {
        stage.setScene(new Scene(createContent()));
        stage.show();
    }

    private Parent createContent() throws IOException {
        FXMLLoader loader = new FXMLLoader();

        return loader.load(
            getClass().getResourceAsStream("commit.fxml")
        );
    }

    public static void main(String[] args) {
        launch(args);
    }
}
  

фиксация.fxml

 <?import javafx.scene.control.TableColumn?>
<?import javafx.scene.control.TableView?>
<TableView fx:id="table" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="130.0" prefWidth="113.0" xmlns="http://javafx.com/javafx/8" xmlns:fx="http://javafx.com/fxml/1" fx:controller="commit.CommitController">
  <columns>
    <TableColumn fx:id="value" onEditCommit="#commitValue" prefWidth="85.0" text="C1" />
  </columns>
</TableView>
  

Комментарии:

1. итак, где вы предлагаете улучшение моего кода … я думаю.. по вашему мнению, никаких улучшений не требуется

Ответ №2:

Я внес эти изменения. в EditingCell.java

 public class EditingCell extends TableCell<Record, String> {
  

в EditController.jva
добавлен только столбец таблицы

 public void columnEdit(TableColumn.CellEditEvent<Record,String> event)