Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/email/3.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javafx 2 Java FX 2.2 tableview数据在我上下滚动tableview时发生变化_Javafx 2 - Fatal编程技术网

Javafx 2 Java FX 2.2 tableview数据在我上下滚动tableview时发生变化

Javafx 2 Java FX 2.2 tableview数据在我上下滚动tableview时发生变化,javafx-2,Javafx 2,我在JavaFX2.2中使用了tableView。我有一个列,其中保存了当用户单击按钮时更新的值。这些值正在动态填充,直到这部分工作正常。但是,当我向下滚动表格以查看表格中的其他值时,单元格数据会发生变化。你能建议我需要做什么来解决这个问题吗 下面是我动态填充的表格单元格的代码,在向下滚动表格时会发生更改 Callback<TableColumn, TableCell> cellFactoryField = new Callback<TableColumn, T

我在JavaFX2.2中使用了tableView。我有一个列,其中保存了当用户单击按钮时更新的值。这些值正在动态填充,直到这部分工作正常。但是,当我向下滚动表格以查看表格中的其他值时,单元格数据会发生变化。你能建议我需要做什么来解决这个问题吗

下面是我动态填充的表格单元格的代码,在向下滚动表格时会发生更改

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

        @Override
        public TableCell call(final TableColumn param) {
            final Button button = new Button("Select Field");                    
            final TableCell cell = new TableCell() {

                @Override
                public void updateItem(Object item, boolean empty) {
                    super.updateItem(item, empty);
//                                label.setText("Here");                            
                    if (empty) {
//                                System.out.println("table cell inside updateitem = "+item);
//                                setGraphic(null);
                    }
                    else
                    {      

                    }
                }
            };
            button.setOnAction(new EventHandler<ActionEvent>() {
                private CheckBoxTreeItem<String> checkBoxTreeItem;
                private CheckBoxTreeItem<String> nodeFieldName;
                private CheckBoxTreeItem<String> nodeFieldName2;
                private CheckBoxTreeItem<String> nodeFieldName3;
                private Stage stage = new Stage();

                @Override public void handle(ActionEvent e) 
                {
                    CheckBoxTreeItem<String> rootItem = 
                        new CheckBoxTreeItem<String>("Tables");                            
                    rootItem.setExpanded(true);                  

                    final TreeView tree = new TreeView(rootItem);  
                    tree.setEditable(true);

                    tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());                                                            
                    {
                        checkBoxTreeItem = new CheckBoxTreeItem<String>("Sample Table" );//+ (i+1));                                
                        rootItem.getChildren().add(checkBoxTreeItem);                                                
                        nodeFieldName = new CheckBoxTreeItem<String>("Field Name1");                                
                        nodeFieldName2 = new CheckBoxTreeItem<String>("Field Name2");
                        nodeFieldName3 = new CheckBoxTreeItem<String>("Field Name3");
                        checkBoxTreeItem.getChildren().addAll(nodeFieldName, nodeFieldName2, nodeFieldName3);                    

                    }                                    
                    tree.setRoot(rootItem);
                    tree.setShowRoot(true);                            
                    StackPane root = new StackPane();                                
                    root.getChildren().add(tree);
                    Button selectButton = new Button("Select");
                    HBox hbox = new HBox();
                    hbox.getChildren().add(selectButton);
                    hbox.setAlignment(Pos.CENTER);
                    selectButton.setOnAction(new EventHandler<ActionEvent>(){

                        @Override
                        public void handle(ActionEvent t) {

                            final ArrayList<String> selectedValues = new ArrayList<String>(); 
     //                                    System.out.println("Selected tree items are : ");
                            if(checkBoxTreeItem.isSelected())
                                selectedValues.add(checkBoxTreeItem.getValue());
                            if(nodeFieldName.isSelected())
                                selectedValues.add(nodeFieldName.getValue());
                            if(nodeFieldName2.isSelected())
                                selectedValues.add(nodeFieldName2.getValue());
                            if(nodeFieldName3.isSelected())
                                selectedValues.add(nodeFieldName3.getValue());                               
                            stage.hide();                                
                            for(int i = 0; i<selectedValues.size();i++)
                            {
                                if(i == selectedValues.size()-1)
                                    selectedVals += selectedValues.get(i);    
                                else                                            
                                    selectedVals += selectedValues.get(i)+",";    
                            }
                            fieldNameChosen = true;
                            if(fieldNameChosen)
                                cell.setGraphic(new Label(selectedVals));
                            else
                                cell.setGraphic(button);
                        }
                    });
                    BorderPane borderPane = new BorderPane();
                    borderPane.setCenter(root);
                    borderPane.setBottom(hbox);
                    stage.setScene(new Scene(new Group(borderPane)));                             
                    stage.show();
                }
            });
            if(!(cell.getGraphic() instanceof Label))
                cell.setGraphic(button);
            return cell;
        }
    };
    fieldName.setCellFactory(cellFactoryField);    

还有一个问题:

  • 您正在使用表编辑功能,但未实现所需的API
  • 您可以更新工厂中的单元格,但不能更新备份表的数据
  • 单元格在向外滚动时被销毁(出于性能原因)并重新创建,因此所有更改都会被销毁
  • 有关TableView编辑的正确方法,请参见下一篇教程:

    我还创建了一个小程序,它使用TreeCheckBox阶段通过双击单元格来更新表。我已经在最重要的地方做了标记

    public class TableCellEditing extends Application {
    
        private void init(Stage primaryStage) {
            StackPane root = new StackPane();
            primaryStage.setScene(new Scene(root, 400, 200));
            // you didn't provided data which your Tables use so example will work with Person class
            final ObservableList<Person> data = FXCollections.observableArrayList(
                    new Person("click to edit", "Smith"),
                    new Person("", "Johnson"),
                    new Person("", "Williams1"),
                    new Person("", "Williams2"),
                    new Person("", "Williams3"),
                    new Person("", "Williams4"),
                    new Person("", "Williams5"),
                    new Person("", "Jones"),
                    new Person("", "Brown"),
                    new Person("", "Brown2"));
    
            TableView tableView = new TableView();
            tableView.setItems(data);
            // make table editable
            tableView.setEditable(true);
    
            TableColumn lastNameCol = new TableColumn();
            lastNameCol.setText("Last");
            lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
    
    
            TableColumn firstNameCol = new TableColumn();
            firstNameCol.setText("First");
            // here you connect data list with table column
            firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
            // here you specify that your cells are special and provide editing hooks
            firstNameCol.setCellFactory(new Callback<TableColumn, TableCell>() {
                @Override
                public TableCell call(final TableColumn param) {
    
                    final TableCell cell = new TableCell() {
                        @Override
                        // this method is called on editable tables by double click
                        public void startEdit() {
                            super.startEdit();
                            // here we create new Stage to select items from tree
                            new CheckBoxTreeStage(this).show();
                        }
    
                        @Override
                        public void updateItem(Object item, boolean empty) {
                            super.updateItem(item, empty);
                            if (empty) {
                                setText(null);
                            } else {
                                if (isEditing()) {
                                    setText(null);
                                } else {
                                    // this is the place where we update data by chosen value
                                    setText(getItem().toString());
                                    setGraphic(null);
                                }
                            }
                        }
                    };
                    return cell;
                }
            });
    
            tableView.getColumns().addAll(firstNameCol, lastNameCol);
            tableView.setFocusTraversable(false);
            root.getChildren().add(tableView);
        }
    
        // I've extracted your stage to a separate class for better readability
        private static class CheckBoxTreeStage extends Stage {
    
            private CheckBoxTreeItem<String> checkBoxTreeItem;
            private CheckBoxTreeItem<String> nodeFieldName;
            private CheckBoxTreeItem<String> nodeFieldName2;
            private CheckBoxTreeItem<String> nodeFieldName3;
    
            public CheckBoxTreeStage(final TableCell cell) {
                CheckBoxTreeItem<String> rootItem =
                        new CheckBoxTreeItem<String>("Tables");
                rootItem.setExpanded(true);
    
                final TreeView tree = new TreeView(rootItem);
                tree.setEditable(true);
    
                tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
                {
                    checkBoxTreeItem = new CheckBoxTreeItem<String>("Sample Table");//+ (i+1));                                
                    rootItem.getChildren().add(checkBoxTreeItem);
                    nodeFieldName = new CheckBoxTreeItem<String>("Field Name1");
                    nodeFieldName2 = new CheckBoxTreeItem<String>("Field Name2");
                    nodeFieldName3 = new CheckBoxTreeItem<String>("Field Name3");
                    checkBoxTreeItem.getChildren().addAll(nodeFieldName, nodeFieldName2, nodeFieldName3);
    
                }
                tree.setRoot(rootItem);
                tree.setShowRoot(true);
                StackPane root = new StackPane();
                root.getChildren().add(tree);
                Button selectButton = new Button("Select");
                HBox hbox = new HBox();
                hbox.getChildren().add(selectButton);
                hbox.setAlignment(Pos.CENTER);
                selectButton.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent t) {
    
                        final ArrayList<String> selectedValues = new ArrayList<String>();
                        //                                    System.out.println("Selected tree items are : ");
                        if (checkBoxTreeItem.isSelected()) {
                            selectedValues.add(checkBoxTreeItem.getValue());
                        }
                        if (nodeFieldName.isSelected()) {
                            selectedValues.add(nodeFieldName.getValue());
                        }
                        if (nodeFieldName2.isSelected()) {
                            selectedValues.add(nodeFieldName2.getValue());
                        }
                        if (nodeFieldName3.isSelected()) {
                            selectedValues.add(nodeFieldName3.getValue());
                        }
                        hide();
                        String selectedVals = "";
                        for (int i = 0; i < selectedValues.size(); i++) {
                            if (i == selectedValues.size() - 1) {
                                selectedVals += selectedValues.get(i);
                            } else {
                                selectedVals += selectedValues.get(i) + ",";
                            }
                        }
                        boolean fieldNameChosen = true;
                        if (fieldNameChosen) {
                            cell.commitEdit(selectedVals);
                        } else {
                            cell.cancelEdit();
                        }
                    }
                });
                BorderPane borderPane = new BorderPane();
                borderPane.setCenter(root);
                borderPane.setBottom(hbox);
                setScene(new Scene(new Group(borderPane)));
            }
        };
    
        public static class Person {
    
            private StringProperty firstName;
            private StringProperty lastName;
    
            private Person(String fName, String lName) {
                this.firstName = new SimpleStringProperty(fName);
                this.lastName = new SimpleStringProperty(lName);
            }
    
            public StringProperty firstNameProperty() {
                return firstName;
            }
    
            public StringProperty lastNameProperty() {
                return lastName;
            }
        }
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            init(primaryStage);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }
    
    公共类TableCellEditing扩展了应用程序{
    私有void init(阶段primaryStage){
    StackPane root=新的StackPane();
    原始阶段。设置场景(新场景(根,400200));
    //您并没有提供表使用的数据,所以示例将用于Person类
    最终ObservableList数据=FXCollections.observableArrayList(
    新人(“点击编辑”、“史密斯”),
    新人(“约翰逊”),
    新人(“威廉斯1”),
    新人(“威廉斯2”),
    新人(“威廉斯”),
    新人(“威廉斯”),
    新人(“威廉斯”),
    新人(“琼斯”),
    新人(“布朗”),
    新人(“,”布朗“);
    TableView TableView=新建TableView();
    tableView.setItems(数据);
    //使表格可编辑
    tableView.setEditable(true);
    TableColumn lastNameCol=新建TableColumn();
    lastNameCol.setText(“Last”);
    lastNameCol.setCellValueFactory(新属性ValueFactory(“lastName”));
    TableColumn firstNameCol=新TableColumn();
    firstNameCol.setText(“第一”);
    //在这里,您可以将数据列表与表列连接起来
    firstNameCol.setCellValueFactory(新属性ValueFactory(“firstName”));
    //在这里,您可以指定单元格是特殊的,并提供编辑挂钩
    firstNameCol.setCellFactory(新回调(){
    @凌驾
    公共TableCell调用(最终TableColumn参数){
    最终TableCell单元格=新TableCell(){
    @凌驾
    //双击可编辑表调用此方法
    公开作废已启动IT(){
    super.startEdit();
    //在这里,我们创建一个新的阶段来从树中选择项目
    新建CheckBoxTreeStage(this.show();
    }
    @凌驾
    public void updateItem(对象项,布尔值为空){
    super.updateItem(项,空);
    if(空){
    setText(空);
    }否则{
    if(isEditing()){
    setText(空);
    }否则{
    //这是我们根据所选值更新数据的地方
    setText(getItem().toString());
    设置图形(空);
    }
    }
    }
    };
    返回单元;
    }
    });
    tableView.getColumns().addAll(firstNameCol,lastNameCol);
    tableView.setFocusTraversable(false);
    root.getChildren().add(tableView);
    }
    //为了更好的可读性,我将你的舞台提取到了一个单独的类中
    私有静态类CheckBoxTreeStage扩展阶段{
    私人CheckBoxTreeItem CheckBoxTreeItem;
    私有CheckBoxTreeItem节点字段名;
    私有CheckBoxTreeItem节点字段名2;
    私有CheckBoxTreeItem节点字段名3;
    公共CheckBoxTreeStage(最终表格单元格){
    CheckBoxTreeItem根项目=
    新复选框项目(“表格”);
    setExpanded(true);
    最终树视图树=新树视图(根项目);
    tree.setEditable(true);
    setCellFactory(CheckBoxTreeCell.forTreeView());
    {
    checkBoxTreeItem=新的checkBoxTreeItem(“样本表”);//+(i+1));
    rootItem.getChildren().add(checkBoxTreeItem);
    nodeFieldName=新的CheckBoxTreeItem(“字段名称1”);
    nodeFieldName2=新的CheckBoxTreeItem(“字段名称2”);
    nodeFieldName3=新的CheckBoxTreeItem(“字段名称3”);
    checkBoxTreeItem.getChildren().addAll(nodeFieldName、nodeFieldName2、nodeFieldName3);
    }
    tree.setRoot(rootItem);
    tree.setShowRoot(true);
    StackPane root=新的StackPane();
    root.getChildren().add(树);
    按钮选择按钮=新按钮(“选择”);
    HBox HBox=新的HBox();
    hbox.getChildren().add(选择按钮);
    hbox.设置校准(位置中心);
    selectButton.setOnAction(新的EventHandler(){
    @凌驾
    公共无效句柄(ActionEvent t){
    最终ArrayList selectedValues=新ArrayList();
    //System.out.println(“选定的树项为:”);
    if(checkBoxTreeItem.isSelected()){
    
                return new SimpleStringProperty(valueFromData);
    
            }
        });             
    
    public class TableCellEditing extends Application {
    
        private void init(Stage primaryStage) {
            StackPane root = new StackPane();
            primaryStage.setScene(new Scene(root, 400, 200));
            // you didn't provided data which your Tables use so example will work with Person class
            final ObservableList<Person> data = FXCollections.observableArrayList(
                    new Person("click to edit", "Smith"),
                    new Person("", "Johnson"),
                    new Person("", "Williams1"),
                    new Person("", "Williams2"),
                    new Person("", "Williams3"),
                    new Person("", "Williams4"),
                    new Person("", "Williams5"),
                    new Person("", "Jones"),
                    new Person("", "Brown"),
                    new Person("", "Brown2"));
    
            TableView tableView = new TableView();
            tableView.setItems(data);
            // make table editable
            tableView.setEditable(true);
    
            TableColumn lastNameCol = new TableColumn();
            lastNameCol.setText("Last");
            lastNameCol.setCellValueFactory(new PropertyValueFactory("lastName"));
    
    
            TableColumn firstNameCol = new TableColumn();
            firstNameCol.setText("First");
            // here you connect data list with table column
            firstNameCol.setCellValueFactory(new PropertyValueFactory("firstName"));
            // here you specify that your cells are special and provide editing hooks
            firstNameCol.setCellFactory(new Callback<TableColumn, TableCell>() {
                @Override
                public TableCell call(final TableColumn param) {
    
                    final TableCell cell = new TableCell() {
                        @Override
                        // this method is called on editable tables by double click
                        public void startEdit() {
                            super.startEdit();
                            // here we create new Stage to select items from tree
                            new CheckBoxTreeStage(this).show();
                        }
    
                        @Override
                        public void updateItem(Object item, boolean empty) {
                            super.updateItem(item, empty);
                            if (empty) {
                                setText(null);
                            } else {
                                if (isEditing()) {
                                    setText(null);
                                } else {
                                    // this is the place where we update data by chosen value
                                    setText(getItem().toString());
                                    setGraphic(null);
                                }
                            }
                        }
                    };
                    return cell;
                }
            });
    
            tableView.getColumns().addAll(firstNameCol, lastNameCol);
            tableView.setFocusTraversable(false);
            root.getChildren().add(tableView);
        }
    
        // I've extracted your stage to a separate class for better readability
        private static class CheckBoxTreeStage extends Stage {
    
            private CheckBoxTreeItem<String> checkBoxTreeItem;
            private CheckBoxTreeItem<String> nodeFieldName;
            private CheckBoxTreeItem<String> nodeFieldName2;
            private CheckBoxTreeItem<String> nodeFieldName3;
    
            public CheckBoxTreeStage(final TableCell cell) {
                CheckBoxTreeItem<String> rootItem =
                        new CheckBoxTreeItem<String>("Tables");
                rootItem.setExpanded(true);
    
                final TreeView tree = new TreeView(rootItem);
                tree.setEditable(true);
    
                tree.setCellFactory(CheckBoxTreeCell.<String>forTreeView());
                {
                    checkBoxTreeItem = new CheckBoxTreeItem<String>("Sample Table");//+ (i+1));                                
                    rootItem.getChildren().add(checkBoxTreeItem);
                    nodeFieldName = new CheckBoxTreeItem<String>("Field Name1");
                    nodeFieldName2 = new CheckBoxTreeItem<String>("Field Name2");
                    nodeFieldName3 = new CheckBoxTreeItem<String>("Field Name3");
                    checkBoxTreeItem.getChildren().addAll(nodeFieldName, nodeFieldName2, nodeFieldName3);
    
                }
                tree.setRoot(rootItem);
                tree.setShowRoot(true);
                StackPane root = new StackPane();
                root.getChildren().add(tree);
                Button selectButton = new Button("Select");
                HBox hbox = new HBox();
                hbox.getChildren().add(selectButton);
                hbox.setAlignment(Pos.CENTER);
                selectButton.setOnAction(new EventHandler<ActionEvent>() {
                    @Override
                    public void handle(ActionEvent t) {
    
                        final ArrayList<String> selectedValues = new ArrayList<String>();
                        //                                    System.out.println("Selected tree items are : ");
                        if (checkBoxTreeItem.isSelected()) {
                            selectedValues.add(checkBoxTreeItem.getValue());
                        }
                        if (nodeFieldName.isSelected()) {
                            selectedValues.add(nodeFieldName.getValue());
                        }
                        if (nodeFieldName2.isSelected()) {
                            selectedValues.add(nodeFieldName2.getValue());
                        }
                        if (nodeFieldName3.isSelected()) {
                            selectedValues.add(nodeFieldName3.getValue());
                        }
                        hide();
                        String selectedVals = "";
                        for (int i = 0; i < selectedValues.size(); i++) {
                            if (i == selectedValues.size() - 1) {
                                selectedVals += selectedValues.get(i);
                            } else {
                                selectedVals += selectedValues.get(i) + ",";
                            }
                        }
                        boolean fieldNameChosen = true;
                        if (fieldNameChosen) {
                            cell.commitEdit(selectedVals);
                        } else {
                            cell.cancelEdit();
                        }
                    }
                });
                BorderPane borderPane = new BorderPane();
                borderPane.setCenter(root);
                borderPane.setBottom(hbox);
                setScene(new Scene(new Group(borderPane)));
            }
        };
    
        public static class Person {
    
            private StringProperty firstName;
            private StringProperty lastName;
    
            private Person(String fName, String lName) {
                this.firstName = new SimpleStringProperty(fName);
                this.lastName = new SimpleStringProperty(lName);
            }
    
            public StringProperty firstNameProperty() {
                return firstName;
            }
    
            public StringProperty lastNameProperty() {
                return lastName;
            }
        }
    
        @Override
        public void start(Stage primaryStage) throws Exception {
            init(primaryStage);
            primaryStage.show();
        }
    
        public static void main(String[] args) {
            launch(args);
        }
    }