具有显示错误的JavaFX可编辑表格单元格

问题描述:

根据Brian的建议编辑问题:

Editing the question as per Brian's suggestion:

我现在已将其修剪为一个整数列。
我根本无法在代码中找到问题。仅当列被选择一次进行编辑时,才会显示值。
请建议我在EditingCell类中犯了一些错误。

I have now trimmed it down to just a single integer column. I am simply not able to find the problem in the code. THe values show up only when the columns are selected once for edit. Please suggest of i am making some mistake in the EditingCell class.

我正在尝试的单个类文件代码如下。

The single classfile code that i am trying is as follows.

package javafxtest;


import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
//import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
import javafx.util.Callback;


/**
 * FXML Controller class
 *
 * @author balz
 */
public class UploadTemplateController extends Application {

    @Override public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
    }
    public static void main(String[] args) { launch(args); }

    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setScene(new Scene(root));
        MasterUploadParameter objMasterUploadParameter=new MasterUploadParameter();
        MasterUploadParameter objMasterUploadParameter1=new MasterUploadParameter();
        MasterUploadParameter objMasterUploadParameter2=new MasterUploadParameter();

        final ObservableList<MasterUploadParameter> tableContent =
            FXCollections.observableArrayList
            (
                objMasterUploadParameter,
                objMasterUploadParameter1,
                objMasterUploadParameter2
            );

        TableColumn ColumnID = new TableColumn();
        ColumnID.setText("columnId");
        ColumnID.setCellValueFactory(new PropertyValueFactory("columnId"));

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

                    public TableCell call(TableColumn p) {

                        return new EditingCell();
                    }
                };
        ColumnID.setCellFactory(cellFactory);




        TableView tableView = new TableView();
        tableView.setItems(tableContent);
        //Enabling editing
        tableView.setEditable(true);
        tableView.getColumns().addAll(ColumnID);
        root.getChildren().add(tableView); 
    }

    private void updateObservableListProperties(TableColumn<MasterUploadParameter, Integer> ColumnFieldNo, TableColumn<MasterUploadParameter, Boolean> ColumnLPad, TableColumn<MasterUploadParameter, Integer> ColumnStarting, TableColumn<MasterUploadParameter, Integer> ColumnEnding, TableColumn<MasterUploadParameter, String> ColumnSheetID, TableColumn<MasterUploadParameter, Integer> ColumnID, TableColumn<MasterUploadParameter, Integer> ColumnStartingRow, TableColumn<MasterUploadParameter, Integer> ColumnEnding0) {
        ColumnFieldNo.setOnEditCommit(new EventHandler<CellEditEvent<MasterUploadParameter, Integer>>() {           
            @Override public void handle(CellEditEvent<MasterUploadParameter, Integer> t) {
                ((MasterUploadParameter) t.getTableView().getItems().get(
                        t.getTablePosition().getRow())).setcolumnId(new SimpleIntegerProperty(t.getNewValue()));
            }
        });


    }
    public static class MasterUploadParameter {
        private SimpleIntegerProperty columnId;
        public SimpleIntegerProperty columnIdProperty() {return columnId;}
        public void setcolumnId(SimpleIntegerProperty columnId) {this.columnId = columnId;}

        public MasterUploadParameter() {
            this.columnId=new SimpleIntegerProperty(0);
        }
    }
    // EditingCell - for editing capability in a TableCell
    public static class EditingCell extends TableCell<MasterUploadParameter, Integer> {
        private TextField textField;

        public EditingCell() {
            System.out.println("find value of textField: "+textField);
        }

        @Override public void startEdit() {
            super.startEdit();
            System.out.println("find value of textField: "+textField);
            if (textField == null) {
                createTextField();
            }
            setText(null);
            setGraphic(textField);
            textField.selectAll();
        }

        @Override public void cancelEdit() {
            super.cancelEdit();
            setText(String.valueOf(getItem()));
            setGraphic(null);
        }

        public void updateItem(Integer item, boolean empty) {
            System.out.println("find value of update: "+empty+item);
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(getString());
                    setGraphic(null);
                }
            }
        }

        private void createTextField() {
            textField = new TextField(getString());
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
            textField.setOnKeyReleased(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();
        }

    } 


}


您不需要单独的编辑单元格类型。您可以使用col.setOnEditCommit方法

You don't need separate editing cell types. You can use the col.setOnEditCommit method

只需使用公共静态类EditingCell扩展TableCell {,不包含类型信息。 (我想这就是你之前遗漏了@override的原因。)

Just use public static class EditingCell extends TableCell{ with no type information. (I guess that's why you left out @override before.)

将updateItem更改为 @Override public void updateItem(Object item,boolean empty) {

Change the updateItem to @Override public void updateItem(Object item, boolean empty) {

然后每当你调用commitEdit时都使用一个字符串(所有文本字段都有字符串)。 commitEdit(textField.getText())

Then whenever you call commitEdit use a string (all textfields have strings anyway). commitEdit(textField.getText())

然后对于每个列,取决于您可以提交编辑的类型但是你想要。

Then for each column depending, on the type you can commit the edit however you want.

import javafx.application.Application;
import static javafx.application.Application.launch;
import javafx.application.Platform;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.beans.property.SimpleStringProperty;
import javafx.beans.property.StringProperty;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.TableCell;
import javafx.scene.control.TableColumn;
import javafx.scene.control.TableColumn.CellEditEvent;
import javafx.scene.control.TableView;
import javafx.scene.control.TextField;
//import javafx.scene.control.cell.CheckBoxTableCell;
import javafx.scene.control.cell.PropertyValueFactory;
import javafx.scene.input.KeyCode;
import javafx.scene.input.KeyEvent;
import javafx.stage.Stage;
import javafx.util.Callback;


/**
 * FXML Controller class
 *
 * @author balz
 */
public class UploadTemplateController extends Application {

    @Override public void start(Stage primaryStage) throws Exception {
        init(primaryStage);
        primaryStage.show();
    }
    public static void main(String[] args) { launch(args); }

    private void init(Stage primaryStage) {
        Group root = new Group();
        primaryStage.setScene(new Scene(root));
        MasterUploadParameter objMasterUploadParameter=new MasterUploadParameter();
        MasterUploadParameter objMasterUploadParameter1=new MasterUploadParameter();
        MasterUploadParameter objMasterUploadParameter2=new MasterUploadParameter();

        final ObservableList<MasterUploadParameter> tableContent =
            FXCollections.observableArrayList
            (
                objMasterUploadParameter,
                objMasterUploadParameter1,
                objMasterUploadParameter2
            );

        Callback<TableColumn, TableCell> cellFactory = new Callback<TableColumn, TableCell>() {
            public TableCell call(TableColumn p) {
                return new EditingCell();
            }
        };

        TableColumn ColumnID = new TableColumn();
        ColumnID.setText("columnId");
        ColumnID.setCellValueFactory(new PropertyValueFactory("columnId"));
        ColumnID.setCellFactory(cellFactory);
        ColumnID.setOnEditCommit(new EventHandler<CellEditEvent<MasterUploadParameter, String>>() {
            @Override
            public void handle(CellEditEvent<MasterUploadParameter, String> evt) {
                try {
                    evt.getTableView().getItems().get(evt.getTablePosition().getRow())
                            .columnId.set(Integer.parseInt(evt.getNewValue()));
                } catch (NumberFormatException numberFormatException) {
                    //do whatever if a non int is entered
                }
            }
        });

        TableColumn columnDesc = new TableColumn("Desc");
        columnDesc.setCellValueFactory(new PropertyValueFactory("desc"));
        columnDesc.setCellFactory(cellFactory);
        columnDesc.setOnEditCommit(new EventHandler<CellEditEvent<MasterUploadParameter, String>>() {
            @Override
            public void handle(CellEditEvent<MasterUploadParameter, String> evt) {
                evt.getTableView().getItems().get(evt.getTablePosition().getRow())
                        .desc.set(evt.getNewValue());
            }
        });

        TableView tableView = new TableView();
        tableView.setItems(tableContent);
        //Enabling editing
        tableView.setEditable(true);
        tableView.getColumns().addAll(ColumnID, columnDesc);
        root.getChildren().add(tableView); 
    }

    public static class MasterUploadParameter {
        private SimpleIntegerProperty columnId;
        public SimpleIntegerProperty columnIdProperty() {return columnId;}

        private StringProperty desc;
        public StringProperty descProperty() {return desc;}

        public MasterUploadParameter() {
            this.columnId=new SimpleIntegerProperty(0);
            this.desc = new SimpleStringProperty("hi");
        }
    }
    // EditingCell - for editing capability in a TableCell
    public static class EditingCell extends TableCell{
        private TextField textField;

        @Override public void startEdit() {
            if (!isEmpty()) {
                super.startEdit();
                createTextField();
                setText(null);
                setGraphic(textField);
                textField.selectAll();
                Platform.runLater(new Runnable() {
                    @Override
                    public void run() {
                        textField.requestFocus();
                    }
                });
            }
        }

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

            try {
                setText(getItem().toString());
            } catch (Exception e) {
            }
            setGraphic(null);
        }

        @Override public void updateItem(Object item, boolean empty) {
            System.out.println("find value of update: "+empty+item);
            super.updateItem(item, empty);
            if (empty) {
                setText(null);
                setGraphic(null);
            } else {
                if (isEditing()) {
                    if (textField != null) {
                        textField.setText(getString());
                    }
                    setText(null);
                    setGraphic(textField);
                } else {
                    setText(getString());
                    setGraphic(null);
                }
            }
        }

        private void createTextField() {
            textField = new TextField(getString());
            textField.setMinWidth(this.getWidth() - this.getGraphicTextGap() * 2);
            textField.setOnKeyReleased(new EventHandler<KeyEvent>() {                
                @Override public void handle(KeyEvent t) {
                    if (t.getCode() == KeyCode.ENTER) {
                        commitEdit(textField.getText());
                    } else if (t.getCode() == KeyCode.ESCAPE) {
                        cancelEdit();
                    }
                }
            });
        }

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

    } 


}