2016-06-10 57 views
0

我有一个带有单元格的TableView。我的表格像坐标系统一样工作,不像通常的表格。 Click here for more about this.JavaFX - 拖放TableCell

现在,我需要拖放一个单元格到另一个(移动)。

这里是我的拖放代码:

tableView.setOnDragDetected(new EventHandler<MouseEvent>() { 
     @Override 
     public void handle(MouseEvent event) { 
      Dragboard db = tableView.startDragAndDrop(TransferMode.MOVE); 
      ClipboardContent content = new ClipboardContent(); 

      int x = tableView.getSelectionModel().getSelectedCells().get(0).getColumn(); 
      int y = tableView.getSelectionModel().getSelectedCells().get(0).getRow(); 

      for(Event e:eventList) { 
       if(e.getAblaufX() == x && e.getAblaufY() == y) { 
        //System.out.println("Event Abteilung: " + e.getAbteilung()); 
        content.put(Config.SERIALIZED_MIME_TYPE, e.getId()); 
       } 
      } 

      db.setContent(content); 
      event.consume(); 
     } 
    }); 

    tableView.setOnDragDropped(new EventHandler<DragEvent>() { 
     @Override 
     public void handle(DragEvent event) { 
      System.out.println("Drag Dropped!"); 

      Dragboard db = event.getDragboard(); 
      if (db.hasContent(Config.SERIALIZED_MIME_TYPE)) { 
       int draggedEventId = (Integer) db.getContent(Config.SERIALIZED_MIME_TYPE); 
       Event draggedEvent = null; 
       //System.out.println("Dragged Event ID: " + draggedEventId); 
       for(Event e:eventList) { 
        if(e.getId() == draggedEventId) { 
         draggedEvent = e; 
         eventMap.get(e).setAblaufX(ablaufX); // <-- HERE I NEED CELL INDEX 
         eventMap.get(e).setAblaufY(ablaufY); // <-- HERE I NEED ROW INDEX 
         //eventMap.put(new TablePos(draggedEvent.getAblaufX(), draggedEvent.getAblaufY()), draggedEvent); 
        } 
       } 
       if(draggedEvent != null) { 
        event.setDropCompleted(true); 
        event.consume(); 
        System.out.println(draggedEvent.getText()); 
       } 
      } 
     } 
    }); 

    tableView.setOnDragOver(new EventHandler <DragEvent>() { 
     public void handle(DragEvent event) { 
      event.acceptTransferModes(TransferMode.ANY); 
      event.consume(); 
     } 
    }); 

我评论棘手的线条与“// <-- HERE I NEED CELL INDEX”和“// <-- HERE I NEED ROW INDEX

在这些线,我需要的columnIndex和的的的rowIndex已删除单元格(新单元格)

+0

也许我missunderstood但为什么不你可以在拖动检测函数之外声明你的int x和y变量,只有在检测到拖动的时候才设置它,那么你可以在拖动函数 – Inge

+0

中获得当前值,以及如何让我单元格的坐标(columnIndex和rowIndex)放在哪里? –

回答

0

您需要将setOnDragDropped添加到表格单元格中,而不是将它们添加到整个TableView。下面是关于如何获取单元格的行和列索引的MCVE。除了演示如何获取单元格的行和列索引之外,MCVE本身对其他任何内容都没有用处。请告诉我,如果你需要任何进一步的帮助。

import javafx.application.Application; 
import javafx.beans.property.SimpleStringProperty; 
import javafx.collections.FXCollections; 
import javafx.collections.ObservableList; 
import javafx.scene.Scene; 
import javafx.scene.control.TableCell; 
import javafx.scene.control.TableColumn; 
import javafx.scene.control.TableView; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

public class MCVE extends Application { 

    @Override 
    public void start(Stage stage) { 
     TableView<ObservableList<String>> table = new TableView<ObservableList<String>>(); 
     table.getSelectionModel().setCellSelectionEnabled(true); 

     TableColumn<ObservableList<String>, String> col1 = new TableColumn<ObservableList<String>, String>(); 
     TableColumn<ObservableList<String>, String> col2 = new TableColumn<ObservableList<String>, String>(); 

     ObservableList<TableColumn<ObservableList<String>, String>> columns = FXCollections.observableArrayList(col1, 
       col2); 

     table.getColumns().addAll(columns); 

     // For each column we set a cellFactory and a cellValueFactory. 
     for (TableColumn<ObservableList<String>, String> col : columns) { 
      col.setCellValueFactory(e -> new SimpleStringProperty("1")); 

      // We need to set the cell factory so that we can create a cell and manipulate its behavior. 
      col.setCellFactory(e -> { 
       TableCell<ObservableList<String>, String> cell = new TableCell<ObservableList<String>, String>() { 
        @Override 
        public void updateItem(String item, boolean empty) { 
         // Make sure you call super.updateItem, or you might get really weird bugs. 
         super.updateItem(item, empty); 
         if (item == null || empty) { 
          setText(null); 
          setGraphic(null); 
         } else { 
          setText(item); 
          setGraphic(null); 
         } 
        } 
       }; 

       // HERE IS HOW TO GET THE ROW AND CELL INDEX 
       cell.setOnDragDetected(eh -> { 
        // Get the row index of this cell 
        int rowIndex = cell.getIndex(); 
        System.out.println("Cell row index: " + rowIndex); 

        // Get the column index of this cell. 
        int columnIndex = cell.getTableView().getColumns().indexOf(cell.getTableColumn()); 
        System.out.println("Cell column index: " + columnIndex); 
       }); 

       return cell; 
      }); 
     } 

     ObservableList<ObservableList<String>> items = FXCollections.observableArrayList(
       FXCollections.observableArrayList("1", "2"), FXCollections.observableArrayList("1", "2")); 

     table.setItems(items); 

     BorderPane view = new BorderPane(); 
     view.setCenter(table); 

     stage.setScene(new Scene(view)); 
     stage.show(); 
    } 

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

你可以得到使用EventpickResult访问TableCell,并用它的当前单元格得到的坐标:

private static TableCell getCell(Node node) { 
    // traverse to parent until TableCell is reached 
    // or it's clear there's no TableCell in the hierarchy above node (root visited) 
    while (node != null && !(node instanceof TableCell)) { 
     node = node.getParent(); 
    } 

    return (TableCell) node; 
} 
TableCell targetCell = getCell(event.getPickResult().getIntersectedNode()); 
if (targetCell != null) { 
    int rowIndex = targetCell.getTableRow().getIndex(); 
    int columnIndex = columnToIndex(targetCell.getTableColumn()); 
    ...