簡體   English   中英

JavaFx TreeCell 如何在一秒后擴展節點

[英]JavaFx TreeCell how to expand nodes after one second

我正在一個通用的 TreeView 上實現拖放。 我的目的是在放置一秒鍾后在 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();
});

這個范圍有標准分辨率嗎? 還是我必須自己實現這個功能?

您可以使用PauseTransition來添加延遲。 在其setOnFinished() ,您可以添加在提供的時間過后要執行的操作。

setOnDragEntered() ,您可以啟動PauseTransition ,在setOnDragExited() ,檢查PauseTransitionstatus ,如果它仍處於RUNNING狀態,則stop它。

這是一個簡單的代碼,它在Button上使用setOnMouseEntered()setOnMouseExited() ,而不是上面提到的兩個事件。 但是,這應該足以給你一個想法。

代碼 :

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();
    }
}

我還沒有找到解決這個問題的標准解決方案,但我已經通過自定義實現解決了:

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();
    }
}

通過這種方式,我可以將第一個 enterItem 與我在一秒鍾后擁有的 enterItem 進行比較。

為了完整性:

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

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM