拖放事件完成后,如何在javafx tablecell中设置单元格值?

拖放事件完成后,如何在javafx tablecell中设置单元格值?,java,javafx,drag-and-drop,tableview,Java,Javafx,Drag And Drop,Tableview,我正在设计一个允许拖放TableView单元格的应用程序 但是,一旦拖放完成并且单元格的值成功切换,双击已进行拖放的单元格将使单元格在拖放之前更改回其原始文本 帮我解决这个问题。以下代码用于为所有单元格设置cellFactoryValue。我是javafx新手 private void setCellFactoryForColumns(TableColumn<TimeTable, String> col) { col.setCellFactory((TableColumn&l

我正在设计一个允许拖放
TableView
单元格的应用程序

但是,一旦拖放完成并且单元格的值成功切换,双击已进行拖放的单元格将使单元格在拖放之前更改回其原始文本

帮我解决这个问题。以下代码用于为所有单元格设置
cellFactoryValue
。我是javafx新手

private void setCellFactoryForColumns(TableColumn<TimeTable, String> col)
{
    col.setCellFactory((TableColumn<TimeTable, String> e) -> {
        TableCell<TimeTable, String> cell = new TableCell<TimeTable, String>() {
            @Override
            public void updateItem(String item, boolean empty) {

                super.updateItem(item, empty);
                if (item == null || empty) {
                    setText(null);
                    setGraphic(null);
                } else {
                    setText(item);
                    setGraphic(null);
                }
            }
        };

        col.setOnEditCommit((CellEditEvent<TimeTable, String> t) -> {
            ((TimeTable)t.getTableView().getItems().get(
                    t.getTablePosition().getRow())
                    ).setDay(t.getNewValue());
        });

        cell.setOnDragDetected((MouseEvent event) -> {
            Dragboard db = cell.startDragAndDrop(TransferMode.ANY);

            ClipboardContent content = new ClipboardContent();
            content.putString(cell.getText());
            db.setContent(content);
            cell.setStyle("-fx-background-color: red;"
                        + "-fx-text-fill: white;");
            cell.startEdit();
            cell.setText("Dragged");

            event.consume();
        });

        cell.setOnDragOver((DragEvent event) ->{
            if(event.getGestureSource() != cell &&
                    event.getDragboard().hasString())
            {
                event.acceptTransferModes(TransferMode.MOVE);
                cell.setStyle("-fx-background-color: green;"
                        + "-fx-text-fill: white;");
            }
            event.consume();
        });

        cell.setOnDragEntered((DragEvent event) ->{
           if(event.getGestureSource() != cell &&
                   event.getDragboard().hasString()){
               cell.setStyle("-fx-background-color: yellow;");
           } 
           event.consume();
        });

        cell.setOnDragExited((DragEvent event) -> {
           cell.setStyle("-fx-background-color: grey;");
           event.consume();
        });

        cell.setOnDragDropped((DragEvent event) -> {
            Dragboard db = event.getDragboard();
            boolean success = false;
            if(db.hasString())
            {
                holdData = cell.getText();
                cell.setText(db.getString());
                success = true;
            }

            event.setDropCompleted(success);
            event.consume();
        });

        cell.setOnDragDone((DragEvent event) ->{
           if(event.getTransferMode() == TransferMode.MOVE)
           {
               cell.setText(holdData);
           }
           event.consume();
        });
        return cell;
    });
}
private void setCellFactoryForColumns(TableColumn列)
{
列setCellFactory((表e列)->{
TableCell单元格=新的TableCell(){
@凌驾
public void updateItem(字符串项,布尔值为空){
super.updateItem(项,空);
如果(项==null | |空){
setText(空);
设置图形(空);
}否则{
setText(项目);
设置图形(空);
}
}
};
col.setOnEditCommit((CellEditEvent t)->{
((时间表)t.getTableView().getItems().get(
t、 getTablePosition().getRow())
).setDay(t.getNewValue());
});
cell.setOnDragDetected((MouseeEvent事件)->{
Dragboard db=cell.startDragAndDrop(TransferMode.ANY);
ClipboardContent=新的ClipboardContent();
content.putString(cell.getText());
db.setContent(content);
cell.setStyle(“-fx背景色:红色;”
+“-fx文本填充:白色;”;
cell.startEdit();
cell.setText(“拖动”);
event.consume();
});
cell.setOnDragOver((DragEvent事件)->{
if(event.getGestureSource()!=单元格&&
event.getDragboard().haString())
{
event.acceptTransferModes(TransferMode.MOVE);
cell.setStyle(“-fx背景色:绿色;”
+“-fx文本填充:白色;”;
}
event.consume();
});
cell.setOnDragEntered((DrageEvent事件)->{
if(event.getGestureSource()!=单元格&&
event.getDragboard().haString()){
cell.setStyle(“-fx背景色:黄色;”);
} 
event.consume();
});
cell.setOnDragExited((DrageEvent事件)->{
cell.setStyle(“-fx背景色:灰色;”);
event.consume();
});
cell.setOnDragDropped((DrageEvent事件)->{
Dragboard db=event.getDragboard();
布尔成功=假;
if(db.hastring())
{
holdData=cell.getText();
cell.setText(db.getString());
成功=真实;
}
事件。setDropCompleted(成功);
event.consume();
});
cell.setOnDragDone((DrageEvent事件)->{
if(event.getTransferMode()==TransferMode.MOVE)
{
cell.setText(holdData);
}
event.consume();
});
返回单元;
});
}

您只需更改单元格中的文本,而不是项的属性。因此,每次将新项目分配给
表格单元格
,都会将旧值用作文本

如果将包含项目的单元格从视图中滚动,也会发生这种情况

要修复此问题,请更换

cell.setText(db.getString());

onDragDone
/
ondragdroped
处理程序中的语句

update(cell, db.getString());

分别执行
update
方法,如下所示:

static void update(TableCell<TimeTable, String> cell, String newValue) {
    ((TableRow<TimeTable>)cell.getTableRow()).getItem().setDay(newValue);
    // the below line would be needed, if the setter does not trigger
    // a update of the ObservableValue returned by the cellValueFactory
    // cell.getTableView().refresh();
}

如何实现更新方法?我是javafx新手,不知道如何才能做到这一点。我已经发布了两个版本的
update
方法。。。如果没有关于
时间表
类和列的
cellValueFactory
的更多信息,我无法告诉您可以使用哪一个。
update(cell, holdData);
static void update(TableCell<TimeTable, String> cell, String newValue) {
    ((TableRow<TimeTable>)cell.getTableRow()).getItem().setDay(newValue);
    // the below line would be needed, if the setter does not trigger
    // a update of the ObservableValue returned by the cellValueFactory
    // cell.getTableView().refresh();
}
static <I,P>void update(TableCell<I, P> cell, P newValue) {
    WritableValue<P> property = (WritableValue<P>) cell.getTableColumn().getCellObservableValue(((TableRow<I>)cell.getTableRow()).getItem());
    property.setValue(newValue);
}