2017-04-19 79 views
0

我有一個ListView,它是一個拖動目標。處理OnDragDropped事件時,我想找到位於鼠標位置的列表單元格。另外,我想在鼠標懸停在上方時突出顯示項目,即使在拖放操作期間也是如此。這怎麼能在JavaFx中實現。如何查找位於javafx中放置位置的ListCell

+0

註冊的個體細胞的處理程序,而不是與列表視圖本身 –

回答

0

在列表視圖中使用單元格工廠來定義自定義單元格:通過這種方式,您可以將單個單元格而不是列表視圖註冊到拖動處理程序。然後,拖動處理程序很容易知道哪些單元已經觸發了該事件。

這裏是一個SSCCE:

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.ListCell; 
import javafx.scene.control.ListView; 
import javafx.scene.control.TextField; 
import javafx.scene.input.ClipboardContent; 
import javafx.scene.input.Dragboard; 
import javafx.scene.input.TransferMode; 
import javafx.scene.layout.BorderPane; 
import javafx.scene.text.Text; 
import javafx.stage.Stage; 

public class ListViewWithDragAndDrop extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     ListView<String> listView = new ListView<>(); 
     listView.getItems().addAll("One", "Two", "Three", "Four"); 

     listView.setCellFactory(lv -> { 
      ListCell<String> cell = new ListCell<String>() { 
       @Override 
       protected void updateItem(String item, boolean empty) { 
        super.updateItem(item, empty) ; 
        setText(item); 
       } 
      }; 
      cell.setOnDragOver(e -> { 
       Dragboard db = e.getDragboard(); 
       if (db.hasString()) { 
        e.acceptTransferModes(TransferMode.COPY); 
       } 
      }); 
      cell.setOnDragDropped(e -> { 
       Dragboard db = e.getDragboard(); 
       if (db.hasString()) { 
        String data = db.getString(); 
        if (cell.isEmpty()) { 
         System.out.println("Drop on empty cell: append data"); 
         listView.getItems().add(data); 
        } else { 
         System.out.println("Drop on "+cell.getItem()+": replace data"); 
         int index = cell.getIndex(); 
         listView.getItems().set(index, data); 
        } 
        e.setDropCompleted(true); 
       } 
      }); 

      // highlight cells when drag target. In real life, use an external CSS file 
      // and CSS pseudoclasses.... 
      cell.setOnDragEntered(e -> cell.setStyle("-fx-background-color: gold;")); 
      cell.setOnDragExited(e -> cell.setStyle("")); 
      return cell ; 
     }); 

     TextField textField = new TextField(); 
     textField.setPromptText("Type text and drag to list view"); 
     textField.setOnDragDetected(e -> { 
      Dragboard db = textField.startDragAndDrop(TransferMode.COPY); 
      String data = textField.getText(); 
      Text text = new Text(data); 
      db.setDragView(text.snapshot(null, null)); 
      ClipboardContent cc = new ClipboardContent(); 
      cc.putString(data); 
      db.setContent(cc); 
     }); 

     BorderPane root = new BorderPane(listView, textField, null, null, null); 
     Scene scene = new Scene(root, 400, 400); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

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

太棒了!今晚我會試試這個。謝謝。 – user3612009