Javafx 2 Java fx frop拖放问题
如何在一个listview中进行拖放 我只有一个列表视图(Ed“player”) 我的要求是在同一个玩家列表中上下移动 请找到我使用的代码 (不是:我使用JDK1.7和默认javafx) 示例:(player=listView)Javafx 2 Java fx frop拖放问题,javafx-2,Javafx 2,如何在一个listview中进行拖放 我只有一个列表视图(Ed“player”) 我的要求是在同一个玩家列表中上下移动 请找到我使用的代码 (不是:我使用JDK1.7和默认javafx) 示例:(player=listView) listView.setOnDragDetected(新的EventHandler(){ @凌驾 公共无效句柄(MouseeEvent事件){ Dragboard Dragboard=listView.startDragAndDrop(TransferMode.MOVE
listView.setOnDragDetected(新的EventHandler(){
@凌驾
公共无效句柄(MouseeEvent事件){
Dragboard Dragboard=listView.startDragAndDrop(TransferMode.MOVE);
ClipboardContent=新的ClipboardContent();
content.putString(listView.getSelectionModel().getSelectedItem().getValue());
拖板。设置内容(内容);
}
});
setOnDragDone(新的EventHandler(){
@凌驾
公共无效句柄(DragEvent DragEvent){
System.out.println(“setOnDragDone左”);
}
});
setOnDragEntered(新的EventHandler(){
@凌驾
公共无效句柄(DragEvent DragEvent){
System.out.println(“setOnDragEntered left”);
}
});
setOnDragExited(新的EventHandler(){
@凌驾
公共无效句柄(DragEvent DragEvent){
System.out.println(“setOnDragExited left”);
listView.setBlendMode(空);
}
});
setOnDragOver(新的EventHandler(){
@凌驾
公共无效句柄(DragEvent DragEvent){
System.out.println(“setOnDragOver左”);
DrageEvent.acceptTransferModes(TransferMode.MOVE);
}
});
setOnDragDrop(新的EventHandler(){
@凌驾
公共无效句柄(DragEvent DragEvent){
字符串上下文=dragEvent.getDragboard().getString();
dragEvent.setDropCompleted(真);
}
}
});
我是javafx新手
请您在这方面提供帮助不要在
列表视图上注册拖动处理程序
:您将无法知道拖动开始和结束的单元格。相反,您需要在单元格上注册处理程序。细节有点棘手,但基本思想是创建一个单元工厂,在其中创建自定义单元;您可以在此处设置拖放处理程序
下面是一个例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class DragAndDropListView extends Application {
@Override
public void start(Stage primaryStage) {
final ListView<String> listView = new ListView<>();
for (int i=1; i<=20; i++) {
listView.getItems().add("Item "+i);
}
final IntegerProperty dragFromIndex = new SimpleIntegerProperty(-1);
listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> lv) {
final ListCell<String> cell = new ListCell<String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
setText(item);
}
}
};
cell.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (! cell.isEmpty()) {
dragFromIndex.set(cell.getIndex());
Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
ClipboardContent cc = new ClipboardContent();
cc.putString(cell.getItem());
db.setContent(cc);
// Java 8 only:
// db.setDragView(cell.snapshot(null, null));
}
}
});
cell.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
event.acceptTransferModes(TransferMode.MOVE);
}
}
});
// highlight drop target by changing background color:
cell.setOnDragEntered(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
// should really set a style class and use an external style sheet,
// but this works for demo purposes:
cell.setStyle("-fx-background-color: gold;");
}
}
});
// remove highlight:
cell.setOnDragExited(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
cell.setStyle("");
}
});
cell.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
int dragItemsStartIndex ;
int dragItemsEndIndex ;
int direction ;
if (cell.isEmpty()) {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = listView.getItems().size();
direction = -1;
} else {
if (cell.getIndex() < dragFromIndex.get()) {
dragItemsStartIndex = cell.getIndex();
dragItemsEndIndex = dragFromIndex.get() + 1 ;
direction = 1 ;
} else {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = cell.getIndex() + 1 ;
direction = -1 ;
}
}
List<String> rotatingItems = listView.getItems().subList(dragItemsStartIndex, dragItemsEndIndex);
List<String> rotatingItemsCopy = new ArrayList<>(rotatingItems);
Collections.rotate(rotatingItemsCopy, direction);
rotatingItems.clear();
rotatingItems.addAll(rotatingItemsCopy);
dragFromIndex.set(-1);
}
});
cell.setOnDragDone(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
dragFromIndex.set(-1);
listView.getSelectionModel().select(event.getDragboard().getString());
}
});
return cell ;
}
});
BorderPane root = new BorderPane();
root.setCenter(listView);
Scene scene = new Scene(root, 250, 400);
scene.getStylesheets().add(getClass().getResource("drag-and-drop-list.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
到
setOnDragDetected(…)
方法以获得更好的拖动视觉效果。不要在列表视图上注册拖动处理程序:您将无法知道拖动开始和结束的单元格。相反,您需要在单元格上注册处理程序。细节有点棘手,但基本思想是创建一个单元工厂,在其中创建自定义单元;您可以在此处设置拖放处理程序
下面是一个例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class DragAndDropListView extends Application {
@Override
public void start(Stage primaryStage) {
final ListView<String> listView = new ListView<>();
for (int i=1; i<=20; i++) {
listView.getItems().add("Item "+i);
}
final IntegerProperty dragFromIndex = new SimpleIntegerProperty(-1);
listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> lv) {
final ListCell<String> cell = new ListCell<String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
setText(item);
}
}
};
cell.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (! cell.isEmpty()) {
dragFromIndex.set(cell.getIndex());
Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
ClipboardContent cc = new ClipboardContent();
cc.putString(cell.getItem());
db.setContent(cc);
// Java 8 only:
// db.setDragView(cell.snapshot(null, null));
}
}
});
cell.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
event.acceptTransferModes(TransferMode.MOVE);
}
}
});
// highlight drop target by changing background color:
cell.setOnDragEntered(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
// should really set a style class and use an external style sheet,
// but this works for demo purposes:
cell.setStyle("-fx-background-color: gold;");
}
}
});
// remove highlight:
cell.setOnDragExited(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
cell.setStyle("");
}
});
cell.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
int dragItemsStartIndex ;
int dragItemsEndIndex ;
int direction ;
if (cell.isEmpty()) {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = listView.getItems().size();
direction = -1;
} else {
if (cell.getIndex() < dragFromIndex.get()) {
dragItemsStartIndex = cell.getIndex();
dragItemsEndIndex = dragFromIndex.get() + 1 ;
direction = 1 ;
} else {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = cell.getIndex() + 1 ;
direction = -1 ;
}
}
List<String> rotatingItems = listView.getItems().subList(dragItemsStartIndex, dragItemsEndIndex);
List<String> rotatingItemsCopy = new ArrayList<>(rotatingItems);
Collections.rotate(rotatingItemsCopy, direction);
rotatingItems.clear();
rotatingItems.addAll(rotatingItemsCopy);
dragFromIndex.set(-1);
}
});
cell.setOnDragDone(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
dragFromIndex.set(-1);
listView.getSelectionModel().select(event.getDragboard().getString());
}
});
return cell ;
}
});
BorderPane root = new BorderPane();
root.setCenter(listView);
Scene scene = new Scene(root, 250, 400);
scene.getStylesheets().add(getClass().getResource("drag-and-drop-list.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
到setOnDragDetected(…)
方法以获得更好的拖动视觉效果。不要在列表视图上注册拖动处理程序:您将无法知道拖动开始和结束的单元格。相反,您需要在单元格上注册处理程序。细节有点棘手,但基本思想是创建一个单元工厂,在其中创建自定义单元;您可以在此处设置拖放处理程序
下面是一个例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class DragAndDropListView extends Application {
@Override
public void start(Stage primaryStage) {
final ListView<String> listView = new ListView<>();
for (int i=1; i<=20; i++) {
listView.getItems().add("Item "+i);
}
final IntegerProperty dragFromIndex = new SimpleIntegerProperty(-1);
listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> lv) {
final ListCell<String> cell = new ListCell<String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
setText(item);
}
}
};
cell.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (! cell.isEmpty()) {
dragFromIndex.set(cell.getIndex());
Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
ClipboardContent cc = new ClipboardContent();
cc.putString(cell.getItem());
db.setContent(cc);
// Java 8 only:
// db.setDragView(cell.snapshot(null, null));
}
}
});
cell.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
event.acceptTransferModes(TransferMode.MOVE);
}
}
});
// highlight drop target by changing background color:
cell.setOnDragEntered(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
// should really set a style class and use an external style sheet,
// but this works for demo purposes:
cell.setStyle("-fx-background-color: gold;");
}
}
});
// remove highlight:
cell.setOnDragExited(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
cell.setStyle("");
}
});
cell.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
int dragItemsStartIndex ;
int dragItemsEndIndex ;
int direction ;
if (cell.isEmpty()) {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = listView.getItems().size();
direction = -1;
} else {
if (cell.getIndex() < dragFromIndex.get()) {
dragItemsStartIndex = cell.getIndex();
dragItemsEndIndex = dragFromIndex.get() + 1 ;
direction = 1 ;
} else {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = cell.getIndex() + 1 ;
direction = -1 ;
}
}
List<String> rotatingItems = listView.getItems().subList(dragItemsStartIndex, dragItemsEndIndex);
List<String> rotatingItemsCopy = new ArrayList<>(rotatingItems);
Collections.rotate(rotatingItemsCopy, direction);
rotatingItems.clear();
rotatingItems.addAll(rotatingItemsCopy);
dragFromIndex.set(-1);
}
});
cell.setOnDragDone(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
dragFromIndex.set(-1);
listView.getSelectionModel().select(event.getDragboard().getString());
}
});
return cell ;
}
});
BorderPane root = new BorderPane();
root.setCenter(listView);
Scene scene = new Scene(root, 250, 400);
scene.getStylesheets().add(getClass().getResource("drag-and-drop-list.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
到setOnDragDetected(…)
方法以获得更好的拖动视觉效果。不要在列表视图上注册拖动处理程序:您将无法知道拖动开始和结束的单元格。相反,您需要在单元格上注册处理程序。细节有点棘手,但基本思想是创建一个单元工厂,在其中创建自定义单元;您可以在此处设置拖放处理程序
下面是一个例子:
import java.util.ArrayList;
import java.util.Collections;
import java.util.List;
import javafx.application.Application;
import javafx.beans.property.IntegerProperty;
import javafx.beans.property.SimpleIntegerProperty;
import javafx.event.EventHandler;
import javafx.scene.Scene;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.input.ClipboardContent;
import javafx.scene.input.DragEvent;
import javafx.scene.input.Dragboard;
import javafx.scene.input.MouseEvent;
import javafx.scene.input.TransferMode;
import javafx.scene.layout.BorderPane;
import javafx.stage.Stage;
import javafx.util.Callback;
public class DragAndDropListView extends Application {
@Override
public void start(Stage primaryStage) {
final ListView<String> listView = new ListView<>();
for (int i=1; i<=20; i++) {
listView.getItems().add("Item "+i);
}
final IntegerProperty dragFromIndex = new SimpleIntegerProperty(-1);
listView.setCellFactory(new Callback<ListView<String>, ListCell<String>>() {
@Override
public ListCell<String> call(ListView<String> lv) {
final ListCell<String> cell = new ListCell<String>() {
@Override
public void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty) {
setText(null);
} else {
setText(item);
}
}
};
cell.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
if (! cell.isEmpty()) {
dragFromIndex.set(cell.getIndex());
Dragboard db = cell.startDragAndDrop(TransferMode.MOVE);
ClipboardContent cc = new ClipboardContent();
cc.putString(cell.getItem());
db.setContent(cc);
// Java 8 only:
// db.setDragView(cell.snapshot(null, null));
}
}
});
cell.setOnDragOver(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
event.acceptTransferModes(TransferMode.MOVE);
}
}
});
// highlight drop target by changing background color:
cell.setOnDragEntered(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
if (dragFromIndex.get() >= 0 && dragFromIndex.get() != cell.getIndex()) {
// should really set a style class and use an external style sheet,
// but this works for demo purposes:
cell.setStyle("-fx-background-color: gold;");
}
}
});
// remove highlight:
cell.setOnDragExited(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
cell.setStyle("");
}
});
cell.setOnDragDropped(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
int dragItemsStartIndex ;
int dragItemsEndIndex ;
int direction ;
if (cell.isEmpty()) {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = listView.getItems().size();
direction = -1;
} else {
if (cell.getIndex() < dragFromIndex.get()) {
dragItemsStartIndex = cell.getIndex();
dragItemsEndIndex = dragFromIndex.get() + 1 ;
direction = 1 ;
} else {
dragItemsStartIndex = dragFromIndex.get();
dragItemsEndIndex = cell.getIndex() + 1 ;
direction = -1 ;
}
}
List<String> rotatingItems = listView.getItems().subList(dragItemsStartIndex, dragItemsEndIndex);
List<String> rotatingItemsCopy = new ArrayList<>(rotatingItems);
Collections.rotate(rotatingItemsCopy, direction);
rotatingItems.clear();
rotatingItems.addAll(rotatingItemsCopy);
dragFromIndex.set(-1);
}
});
cell.setOnDragDone(new EventHandler<DragEvent>() {
@Override
public void handle(DragEvent event) {
dragFromIndex.set(-1);
listView.getSelectionModel().select(event.getDragboard().getString());
}
});
return cell ;
}
});
BorderPane root = new BorderPane();
root.setCenter(listView);
Scene scene = new Scene(root, 250, 400);
scene.getStylesheets().add(getClass().getResource("drag-and-drop-list.css").toExternalForm());
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args) {
launch(args);
}
}
到setOnDragDetected(…)
方法,以获得更好的拖动视觉效果。嗨,詹姆斯,我尝试了你的代码拖放操作,但它不起作用。请给我一个明确的例子,我直接从IDE复制了这个:它对我来说工作得很好。“不工作”不是很有帮助。怎么了?嗨,詹姆斯,谢谢你的回复。我的要求是拖动列表中的第三项并将其放到第一位。我可以拖动第三个项目,但无法将其放置到准确的位置,即列表中的第一个项目也添加了代码以突出显示放置目标,如果无法清楚地看到您放置的位置是问题Hi James,它现在对我有效。。非常有用。谢谢你的回复。嗨,詹姆斯,我试过你的代码拖放不起作用。请给我一个明确的例子,我直接从IDE复制了这个:它对我来说工作得很好。“不工作”不是很有帮助。怎么了?嗨,詹姆斯,谢谢你的回复。我的要求是拖动列表中的第三项并将其放到第一位。我可以拖动第三个项目,但无法将其放置到准确的位置,即列表中的第一个项目也添加了代码以突出显示放置目标,如果无法清楚地看到您放置的位置是问题Hi James,它现在对我有效。。非常有用。谢谢你的回复。嗨,詹姆斯,我试过你的代码拖放不起作用。请给我一个明确的例子,我直接从IDE复制了这个:它对我来说工作得很好。“不工作”不是很有帮助。怎么了?嗨,詹姆斯,谢谢你的回复。我的要求是拖动列表中的第三项并将其放到第一位。我可以拖动第三个项目,但无法将其放置到准确的位置,即列表中的第一个项目也添加了代码以突出显示放置目标,如果无法清楚地看到您放置的位置是问题Hi James,它现在对我有效。。非常有用。谢谢你的回复。嗨,詹姆斯,我试过你的代码拖放不起作用。请给我一个明确的例子,我直接从IDE复制了这个:它对我来说工作得很好。“不工作”不是很有帮助。怎么了?嗨