利用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());
}
}
}
}
相關文章: