0
我有一個ListView,它是一個拖動目標。處理OnDragDropped事件時,我想找到位於鼠標位置的列表單元格。另外,我想在鼠標懸停在上方時突出顯示項目,即使在拖放操作期間也是如此。這怎麼能在JavaFx中實現。如何查找位於javafx中放置位置的ListCell
我有一個ListView,它是一個拖動目標。處理OnDragDropped事件時,我想找到位於鼠標位置的列表單元格。另外,我想在鼠標懸停在上方時突出顯示項目,即使在拖放操作期間也是如此。這怎麼能在JavaFx中實現。如何查找位於javafx中放置位置的ListCell
在列表視圖中使用單元格工廠來定義自定義單元格:通過這種方式,您可以將單個單元格而不是列表視圖註冊到拖動處理程序。然後,拖動處理程序很容易知道哪些單元已經觸發了該事件。
這裏是一個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);
}
}
太棒了!今晚我會試試這個。謝謝。 – user3612009
註冊的個體細胞的處理程序,而不是與列表視圖本身 –