JavaFx TreeCell如何在一秒钟后扩展节点

时间:2015-06-23 08:43:24

标签: javafx nodes expand treecell

我在通用TreeView上实现了Drag& Drop。 我的目的是在第二次驻留后,在DragEntered事件期间扩展文件夹,实际代码为:

setOnDragEntered(e -> {
    TreeItem<TreeItemContent> enteredItem = getSourceItem(e);
    if(model.isFolder(enteredItem)){
       enteredItem.setGraphic(images.getFolderOpened());
       enteredItem.setExpanded(true);
    }
    e.consume();
});

期望的:

setOnDragEntered(e -> {
    TreeItem<TreeItemContent> enteredItem = getSourceItem(e);
    if(model.isFolder(enteredItem)){
       if(dragDuration >= 1 sec){
          enteredItem.setGraphic(images.getFolderOpened());
          enteredItem.setExpanded(true);
       }
    }
    e.consume();
});

此范围有标准分辨率吗?或者我必须自己实现这个功能?

2 个答案:

答案 0 :(得分:2)

您可以使用PauseTransition添加延迟。在setOnFinished()上,您可以添加在提供的时间过后执行的操作。

setOnDragEntered(),您可以PauseTransitionsetOnDragExited()开始,查看status的{​​{1}}以及PauseTransition是否仍在RUNNING } status,stop它。

这是一个简单的代码,它在setOnMouseEntered()上使用setOnMouseExited()Button代替上述两个事件。但是,这应该足以让你有个想法。

代码:

import javafx.animation.Animation;
import javafx.animation.PauseTransition;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.util.Duration;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
}

    @Override
    public void start(Stage primaryStage) throws Exception {
        Label label = new Label("Hi");

        Button button = new Button("Add");
        PauseTransition pt = new PauseTransition(Duration.millis(1000));

        pt.setOnFinished( ( ActionEvent event ) -> {
            label.setText(String.valueOf("Done!"));
        });

        button.setOnMouseEntered(event -> {
            pt.play();
        });

        button.setOnMouseExited(event -> {
            if(pt.getStatus() == Animation.Status.RUNNING) {
                pt.stop();
                label.setText("Interrupted");
            }
        });

        VBox box = new VBox(20, label, button);
        box.setAlignment(Pos.CENTER);

        Scene scene = new Scene(box, 200, 200);
        primaryStage.setTitle("Welcome");
        primaryStage.setScene(scene);
        primaryStage.show();
    }
}

答案 1 :(得分:0)

我还没有找到针对此问题的标准解决方案,但我已经通过自定义实现解决了这个问题:

setOnDragEntered(e -> {
    TreeItem<TreeItemContent> enteredItem = getSourceItem(e);
    model.setEnteredItem(enteredItem);
    if(model.isFolder(enteredItem)){
       new Thread(()->{
            try {
                Thread.sleep(1000);
                if(enteredItem == model.getEnteredItem()){
                    enteredItem.setGraphic(images.getFolderOpened());
                    enteredItem.setExpanded(true);
                }
            } catch (Exception e1) {}
       }).start();
    }
}

通过这种方式,我可以将第一个enteredItem与一秒钟后的enteredItem进行比较。

为了完整性:

private TreeItem<TreeItemContent> getSourceItem(InputEvent e){
   return ((TreeCell)e.getSource()).getTreeItem();
}