ドラッグ&ドロップで要素を並べ替えることができるリストビューを持っていますが、2つのデフォルトアイコンを独自のカスタムアイコンに置き換えたい。 ListCell自体またはその親の両方でsetCursor(Cursor.HAND)setCursor(new ImageCursor(image))を試してみましたが、ドラッグ中に何も反映されません。誰でもこれについてどうやって行くのか知っていますか?ドラッグアンドドロップ中にJavaFx ListViewのカーソルを変更する
Edit1:この質問は、並べ替え可能なリストビューを作成する方法とは関係ありません。これは、リストビュー項目のドラッグアンドドロップ時にデフォルトのカーソルを変更する方法です。 drag-n-drop時には、同じデフォルトのカーソルアイコンもあるので、
How to create a reorder-able TableView in JavaFxの複製ではありません。
EDIT2:は、WindowsとLinuxのOSに影響を与えます。
screenshot drag-n-drop not allowed icon
screenshot drag-n-drop allowed icon
package sample;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.scene.Scene;
import javafx.scene.SnapshotParameters;
import javafx.scene.control.ListCell;
import javafx.scene.control.ListView;
import javafx.scene.image.WritableImage;
import javafx.scene.input.*;
import javafx.scene.layout.Pane;
import javafx.stage.Stage;
public class Main extends Application {
@Override
public void start(Stage stage) throws Exception{
Pane pane = new Pane();
ObservableList<String> items = FXCollections.observableArrayList("test1", "test2", "test3", "test4");
ListView<String> lw = new ListView<>();
lw.setCellFactory(param -> new MyListCell());
lw.setItems(items);
pane.getChildren().add(lw);
stage.setTitle("RearrangeListView");
stage.setScene(new Scene(pane, 300, 150));
stage.show();
}
private class MyListCell extends ListCell<String> {
public MyListCell() {
setOnDragDetected(event -> {
if (getItem() == null) {
return;
}
if (event.getButton() == MouseButton.PRIMARY) {
WritableImage image = snapshot(new SnapshotParameters(), null);
Dragboard dragboard = startDragAndDrop(TransferMode.MOVE);
ClipboardContent content = new ClipboardContent();
content.putString("abc");
dragboard.setDragView(image);
dragboard.setContent(content);
//setCursor(Cursor.HAND);
event.consume();
}
});
setOnDragOver(event -> {
if (event.getGestureSource() != this && event.getDragboard().hasString()) {
event.acceptTransferModes(TransferMode.MOVE);
}
event.consume();
});
setOnDragEntered(event -> {
if (event.getGestureSource() != this && event.getDragboard().hasString()) {
setOpacity(0.3);
}
});
setOnDragExited(event -> {
if (event.getGestureSource() != this && event.getDragboard().hasString()) {
setOpacity(1);
}
});
setOnDragDropped(event -> {
if (getItem() == null) {
return;
}
Dragboard db = event.getDragboard();
boolean success = false;
if (db.hasString()) {
ObservableList<String> items = getListView().getItems();
String source = ((MyListCell) event.getGestureSource()).getItem();
String target = ((MyListCell) event.getGestureTarget()).getItem();
int sourceIdx = items.indexOf(source);
int targetIdx = items.indexOf(target);
//swap
items.set(sourceIdx, target);
items.set(targetIdx, source);
success = true;
}
event.setDropCompleted(success);
event.consume();
});
setOnDragDone(DragEvent::consume);
}
@Override
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (empty || item == null) {
setText(null);
} else {
setText(item);
}
}
}
public static void main(String[] args) {
launch(args);
}
}
@ jewelseaこの質問は、並べ替え可能なリストビューを作成する方法とは関係ありません。これは、リストビュー項目のドラッグアンドドロップ時にデフォルトのカーソルを変更する方法です。 – jbilander
@ jewelseaありがとう、しかし、私はあなたの例を試して、それはドラッグ時に同じデフォルトのカーソル(下のボックスのポインタ)に苦しんでいます。このスクリーンショットを見てください。[link](https://dl.dropboxusercontent.com/u/60356891/screenshot_reorder_origami.png)そのカーソルは私が変更しようとしているものです。 – jbilander