Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
92 changes: 92 additions & 0 deletions treedrag/DragAndScrollTreeView.java
Original file line number Diff line number Diff line change
@@ -0,0 +1,92 @@
import javafx.animation.KeyFrame;
import javafx.animation.Timeline;
import javafx.geometry.Orientation;
import javafx.scene.Node;
import javafx.scene.control.ScrollBar;
import javafx.scene.control.TreeItem;
import javafx.scene.control.TreeView;
import javafx.scene.input.DragEvent;
import javafx.scene.input.ScrollEvent;
import javafx.util.Duration;

public class DragAndScrollTreeView<T> extends TreeView<T> {

private Timeline scrollTimeline = new Timeline();
private double scrollVelocity = 0;
private boolean dropped;

// Higher SCROLL_SPEED value = slower scroll.
private static final int SCROLL_SPEED = 100;
private static final int SCROLL_DURATION = 20;


public DragAndScrollTreeView(TreeItem<T> root) {
super(root);

setupScrolling();
}


private void setupScrolling () {
scrollTimeline.setCycleCount(Timeline.INDEFINITE);
scrollTimeline.getKeyFrames().add(new KeyFrame(Duration.millis(SCROLL_DURATION), (ActionEvent) -> dragScroll()));

setOnDragExited((DragEvent event) -> {

if (event.getY() > 0) {
scrollVelocity = 1.0 / SCROLL_SPEED;
}
else {
scrollVelocity = -1.0 / SCROLL_SPEED;
}
if (!dropped){
scrollTimeline.play();
}

});

setOnDragEntered(event -> {
scrollTimeline.stop();
dropped = false;
});

setOnDragDone(event -> {
scrollTimeline.stop();
});

setOnDragDropped((DragEvent event) ->{
scrollTimeline.stop();
event.setDropCompleted(true);
dropped = true;
});

setOnScroll((ScrollEvent event)-> {
scrollTimeline.stop();
});
}


private void dragScroll () {
ScrollBar sb = getVerticalScrollbar();
if (sb != null) {
double newValue = sb.getValue() + scrollVelocity;
newValue = Math.min(newValue, 1.0);
newValue = Math.max(newValue, 0.0);
sb.setValue(newValue);
}
}


private ScrollBar getVerticalScrollbar() {
ScrollBar result = null;
for (Node n : lookupAll(".scroll-bar")) {
if (n instanceof ScrollBar) {
ScrollBar bar = (ScrollBar) n;
if (bar.getOrientation().equals(Orientation.VERTICAL)) {
result = bar;
}
}
}
return result;
}
}
6 changes: 3 additions & 3 deletions treedrag/TaskCellFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public TreeCell<TaskNode> call(TreeView<TaskNode> treeView) {
@Override
protected void updateItem(TaskNode item, boolean empty) {
super.updateItem(item, empty);
if (item == null) return;
if (item == null || empty) return;

ImageView iv1 = new ImageView();
if (item.getName().equals("Tasks")) {
Expand Down Expand Up @@ -86,7 +86,7 @@ private void dragOver(DragEvent event, TreeCell<TaskNode> treeCell, TreeView<Tas

private void drop(DragEvent event, TreeCell<TaskNode> treeCell, TreeView<TaskNode> treeView) {
Dragboard db = event.getDragboard();
boolean success = false;
event.setDropCompleted(false);
if (!db.hasContent(JAVA_FORMAT)) return;

TreeItem<TaskNode> thisItem = treeCell.getTreeItem();
Expand All @@ -106,7 +106,7 @@ private void drop(DragEvent event, TreeCell<TaskNode> treeCell, TreeView<TaskNod
thisItem.getParent().getChildren().add(indexInParent + 1, draggedItem);
}
treeView.getSelectionModel().select(draggedItem);
event.setDropCompleted(success);
event.setDropCompleted(true);
}

private void clearDropLocation() {
Expand Down
2 changes: 1 addition & 1 deletion treedrag/TreeDragDemo.java
Original file line number Diff line number Diff line change
Expand Up @@ -29,7 +29,7 @@ public void start(Stage primaryStage) {
children.add(new TreeItem<TaskNode>(new TaskNode("walk dog")));
children.add(new TreeItem<TaskNode>(new TaskNode("buy beer")));

TreeView<TaskNode> tree = new TreeView<TaskNode>(rootItem);
DragAndScrollTreeView<TaskNode> tree = new DragAndScrollTreeView<TaskNode>(rootItem);
tree.setCellFactory(new TaskCellFactory());

StackPane root = new StackPane();
Expand Down