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

标签 java javafx drag-and-drop tableview

我正在设计一个允许在 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;
    });
}

最佳答案

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

如果您将包含项目的单元格滚动到 View 之外,也会发生这种情况。

要解决此问题,请替换

cell.setText(db.getString());

cell.setText(holdData);

onDragDone/onDragDropped 处理程序中的语句

update(cell, db.getString());

update(cell, holdData);

分别并实现 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();
}

如果您的 cellValueFactory 返回一个允许写入项目的 WritableProperty,则该方法可以编写为更通用的

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);
}

关于java - 拖放事件完成后,如何在 javafx tablecell 中设置单元格值?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/38199385/

相关文章:

java - 在一个简单的Spring+Hibernate应用程序中,如何解析 "Unrecognized listener type"?

java - 如何正确地将 MouseHandler 添加到我的 JFreeChart-FX 以从左向右拖动图表

java - 拖动项目时滚动 gridview(作为阴影)

java - 使用 Java Zxing API 将条码内容写为条码下方的标签

Java重绘()/更新()

java - 根据最佳实践,我应该在哪里放置用于 GUI 测量的 JavaFX 常量?

java - EventHandler 在一个单独的类中

c++ - Qt 拖放 QTreeView

ajax - 拖放支持的最佳 ajax 框架

java - Eclipse Oxygen 中的 Spring Boot 项目