利用JavaFx开发RIA桌面应用-文件拖拽

转载请注明来源-作者@loongshawn:http://blog.csdn.net/loongshawn/article/details/53023429

1 背景

给JavaFx中的TextField控件添加文件拖拽功能,即实现将文件或文件夹拖拽至TeuxtField中,TextField显示出相应的路径地址。

利用JavaFx开发RIA桌面应用-文件拖拽_第1张图片

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

相关文章:

  • 《 利用JavaFx开发RIA桌面应用-TableView操作》
  • 《 利用JavaFx开发RIA桌面应用-Clipboard剪贴板操作》
  • 《利用JavaFx开发RIA桌面应用-TextField替换PasswordField做密码框》
  • 《利用JavaFx开发RIA桌面应用-半透明界面设计》
  • 《利用JavaFx开发RIA桌面应用-加载等待界面设计》
  • 《利用JavaFx开发RIA桌面应用-文件拖拽》
  • 《利用JavaFx开发RIA桌面应用-改变stage的标题栏的图标》
  • 《利用JavaFx开发RIA桌面应用-事件监听》
  • 《利用JavaFx开发RIA桌面应用-ComboBox组合编辑框水平增长》
  • 《利用JavaFx开发RIA桌面应用-布局说明》
  • 《利用JavaFx开发RIA桌面应用-在线资料》

你可能感兴趣的:(JavaFX)