1. 程式人生 > >利用JavaFx開發RIA桌面應用-檔案拖拽

利用JavaFx開發RIA桌面應用-檔案拖拽

1 背景

給JavaFx中的TextField控制元件新增檔案拖拽功能,即實現將檔案或資料夾拖拽至TeuxtField中,TextField顯示出相應的路徑地址。

這裡寫圖片描述

2 監聽器

在JavaFX中關於拖放操作,可以設定這麼幾種事件監聽器:

  • setOnDragDetected(new EventHandler());
    當你從一個Node上進行拖動的時候,會檢測到拖動操作,將會執行這個EventHandler。

  • setOnDragEntered(new EventHandler());
    當你拖動到目標控制元件的時候,會執行這個事件回撥。

  • setOnDragExited(new EventHandler());
    當你拖動移出目標控制元件的時候,執行這個操作。

  • setOnDragOver(new EventHandler());
    當你拖動到目標上方的時候,會不停的執行。

  • setOnDragDropped(new EventHandler());
    當你拖動到目標並鬆開滑鼠的時候,執行這個DragDropped事件。

  • setOnDragDone(new EventHandler());
    當你拖動並鬆手的時候,執行Drag完成操作。

這裡要注意的是,首先執行拖動,拖動到目標控制元件的時候,會首先執行DragEnter,這個只執行一遍。然後當你停留在目標控制元件上方的時候,會不停的指定DragOver操作。

大家依據實際操作對不同環節的拖拽動作進行取捨。

3 實現

首先建立一個TextField的單例類,類中提供了一個getTextFiled方法獲取TextField物件。

/**
 * Created by loongshawn on 2016/11/3.
 *
 * NOTE 路徑輸入框拖入事件
 */
public class MyStyleTextField {

    private static MyStyleTextField uniqueInstance = null;

    private MyStyleTextField(){

    }

    public static MyStyleTextField getInstance
(){ if (uniqueInstance == null){ uniqueInstance = new MyStyleTextField(); } return uniqueInstance; } public TextField getTextFiled(){ TextField textField = new TextField(); textField.setOnDragOver(new DragOverEvent(textField)); textField.setOnDragDropped(new DragDroppedEvent(textField)); return textField; } }

接下來需要給這個TextField物件新增拖拽事件監聽,即上述程式碼中的:

textField.setOnDragOver(new DragOverEvent(textField));
textField.setOnDragDropped(new DragDroppedEvent(textField));

本例中只需要新增兩個響應事件即:1、檔案拖到控制元件上方;2、滑鼠按鈕鬆開

  • setOnDragOver(new EventHandler());
  • setOnDragDropped(new EventHandler());

具體事件監聽程式碼:

/**
 * Created by loongshawn 2016/11/3.
 *
 * NOTE 檔案拖到控制元件上方事件
 */
public class DragOverEvent implements EventHandler<DragEvent> {

    private TextField textField;

    public DragOverEvent(TextField textField){
        this.textField = textField;
    }

    public void handle(DragEvent event) {

        if (event.getGestureSource() != textField){
            event.acceptTransferModes(TransferMode.ANY);
        }
    }
}

/**
 * Created by loongshawn 2016/11/3.
 *
 * NOTE 檔案拖到控制元件上方,滑鼠鬆開事件
 */
public class DragDroppedEvent implements EventHandler<DragEvent> {

    private static final Logger logger = Logger.getLogger(DragDroppedEvent.class);

    private TextField textField;

    public DragDroppedEvent(TextField textField){
        this.textField = textField;
    }

    public void handle(DragEvent event) {
        Dragboard dragboard = event.getDragboard();
        if (dragboard.hasFiles()){
            try {
                File file = dragboard.getFiles().get(0);
                if (file != null) {
                    textField.setText(file.getAbsolutePath());
                }
            }catch (Exception e){
                logger.debug(e.toString());
            }
        }
    }
}

相關文章: