【发布时间】:2015-05-26 08:54:10
【问题描述】:
我只想将一个项目从我的ListView 拖放到我的TreeView 的特定位置。我知道如何处理DragEvents。但是我怎样才能得到我的 treeView 的放置位置呢? “位置”是指“在哪个树视图项目上下降(从该树视图项目获取参考)”。
package main;
import javafx.application.Application;
import javafx.collections.FXCollections;
import javafx.collections.ObservableList;
import javafx.event.Event;
import javafx.event.EventHandler;
import javafx.event.EventType;
import javafx.scene.Node;
import javafx.scene.Scene;
import javafx.scene.control.*;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.image.Image;
import javafx.scene.image.ImageView;
import javafx.scene.input.DragEvent;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.Callback;
public class Program extends Application {
String buffer = "";
public static void main(String args[]) {
launch(args);
}
@Override
public void start(Stage primaryStage) throws Exception {
primaryStage.setTitle("Tree View Sample");
HBox box = new HBox();
//ListView
ListView<String> list = new ListView<String>();
ObservableList<String> items = FXCollections.observableArrayList(
"Single", "Double", "Suite", "Family App");
list.setItems(items);
list.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent event) {
System.out.println("Drag something from ListView");
}
});
//TreeView
TreeItem<String> rootItem = new TreeItem<String>("Inbox");
rootItem.setExpanded(true);
for (int i = 1; i < 6; i++) {
TreeItem<String> item = new TreeItem<String>("Message" + i);
rootItem.getChildren().add(item);
}
TreeView<String> treeView = new TreeView<String>(rootItem);
treeView.setEditable(true);
treeView.setCellFactory(new Callback<TreeView<String>, TreeCell<String>>() {
@Override
public TreeCell<String> call(TreeView<String> stringTreeView) {
TreeCell<String> treeCell = new TreeCell<String>() {
protected void updateItem(String item, boolean empty) {
super.updateItem(item, empty);
if (item != null) {
setText(item);
}
}
};
treeCell.setOnDragDetected(new EventHandler<MouseEvent>() {
@Override
public void handle(MouseEvent mouseEvent) {
System.out.println("Drag: " + treeCell.getItem());
}
});
treeCell.setOnDragDropped(new EventHandler<DragEvent>() {
public void handle(DragEvent event) {
//THIS METHOD DOESN'T WORK (It doesn't called, when i drag something from listview to treeview)
System.out.println("Dropped something");
event.setDropCompleted(true);
event.consume();
}
});
return treeCell;
}
});
box.getChildren().addAll(list,treeView);
//Create Scene
Scene scene = new Scene(box);
//Add Scene to Stage..
primaryStage.setScene(scene);
primaryStage.show();
}
}
除了 setOnDragDetected 处理程序外,没有任何工作。为什么?
示例我正在尝试:
想要通过拖放消息 2 与“双”进行更改。
或者我想用“Single”更改消息 1。
上面的代码只是一个更大的项目的测试。
【问题讨论】:
-
到目前为止你尝试了什么?
-
如果您使用 javafx,为什么要导入
java.awt.*? -
只是一次错误点击.. 我删除了它。 [问题未解决]
-
好吧,也许看看这个帖子Drag'n'Drop TreeItem。
-
好的.. 解决方案不远了。最后一个问题是 treeCell.setOnDragDropped(new EventHandler
().. 它不起作用(更新了上层代码)
标签: java javafx drag-and-drop javafx-8