2016-06-10 14 views
0

Ich habe eine TableView mit Zellen drin. Meine Tabelle funktioniert wie ein Koordinatensystem, nicht wie eine normale Tabelle. Click here for more about this.JavaFX - Drag & Drop TableCell

Jetzt muss ich eine Zelle zu einem anderen ziehen und ablegen (Move).

Hier ist mein Code für Drag and Drop:

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

ich die heikelen Zeilen mit "// <-- HERE I NEED CELL INDEX" kommentiert und "// <-- HERE I NEED ROW INDEX"

Aus diesen Zeilen, ich brauche die column und die rowIndex des abgelegte Zelle (die neue Zelle)

+0

Vielleicht ‚i missunderstood aber warum don t deklarieren Sie Ihre int X- und Y-Variablen außerhalb der Zieh- Erkennungsfunktion und setzen sie nur dann, wenn der Ziehvorgang erkannt wird. Dann können Sie den aktuellen Wert in der Ziehfunktion – Inge

+0

abrufen und wie bekomme ich die Koordinaten (columnIndex und rowIndex) der Zelle, in die sie fallen soll? –

Antwort

0

Sie müssen die setOnDragDropped zu den Tabellenzellen hinzufügen, anstatt sie zu der gesamten TableView hinzuzufügen. Unten ist ein MCVE, wie man den Zeilen- und Spaltenindex einer Zelle bekommt. Der MCVE selbst ist für nichts anderes nützlich, als zu zeigen, wie der Zeilen- und Spaltenindex einer Zelle erhalten wird. Bitte sagen Sie mir, wenn Sie weitere Hilfe benötigen.

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

Sie könnten die die aktuelle Zelle erhalten die pickResult des Event mit dem TableCell zugreifen und es verwenden, um die Koordinaten zu erhalten:

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()); 
    ...