【问题标题】:Drag text from browser into JavaFX GUI将文本从浏览器拖入 JavaFX GUI
【发布时间】:2016-03-12 19:39:33
【问题描述】:

我找不到任何类似这样的问题:JavaFX 中有没有办法显示一个接受用户从浏览器拖放的文本的 GUI(舞台)?

例如,用户导航到某个 URL,然后复制所有页面的文本并将其拖到显示的 JavaFX 阶段。然后可以在 Java 程序中使用该文本。我不想使用 Selenium,这样我的应用就不会执行任何类似抓取的活动。

我正在寻找与 Windows XP+ 和所有浏览器兼容的解决方案。

任何关于起点、教程、帖子或限制的反馈都很棒。谢谢

【问题讨论】:

  • JavaFX 支持从本地源拖放。 docs.oracle.com/javafx/2/drag_drop/jfxpub-drag_drop.htm
  • 抱歉,您所说的本地资源是什么意思?我的 JavaFX 应用程序最终将成为用户 PC 上的可执行 jar。这是否意味着如果他们安装了 Chrome、IE、Firefox 等,它被认为是原生源,因此与 jar 文件兼容?我现在就开始阅读。
  • “本地来源”是指来自 Java 虚拟机之外(即来自计算机上运行的其他应用程序)。本机网络浏览器(或任何网络浏览器)就是一个例子。
  • @JimJim 您的 JavaFX 应用程序可以从任何其他应用程序接收 DnD,无论是用户的浏览器、Word、记事本等。只需实施适当的放置目标,您就可以开始了。事实上,默认文本区域可能会采用 DnD 而无需您执行任何操作,就像它会接受粘贴一样。
  • @JimJim 无赖,懒惰的 JavaFX 实现者。需要考虑的一个有点相关的事情是,从用户体验的角度来看,大块文本的 DnD 是一个非常挑剔和繁琐的操作,尤其是在不同的、可能重叠的窗口之间。剪切和粘贴更简单,如果您想变得花哨并且您的来源是浏览器,您可以编写一个书签,通过本地 HTTP 调用将内容发送到您的应用程序。

标签: browser text javafx drag-and-drop stage


【解决方案1】:

你可以试试这样的:

public class MainApp extends Application {

    @Override
    public void start(Stage stage) throws Exception {
        TextField textField = new TextField();
        textField.setPromptText("Drag text here");
        textField.addEventHandler(
                DragEvent.DRAG_OVER,
                event -> {
                    if (event.getDragboard().hasString()) {
                        event.acceptTransferModes(TransferMode.COPY);
                    }
                    event.consume();
                });
        textField.addEventHandler(
                DragEvent.DRAG_DROPPED,
                event -> {
                    Dragboard dragboard = event.getDragboard();
                    if (event.getTransferMode() == TransferMode.COPY && 
                            dragboard.hasString()) {
                        textField.setText(dragboard.getString());
                        event.setDropCompleted(true);
                    }
                    event.consume();
                });
        StackPane stackPane = new StackPane(textField);
        stackPane.setPadding(new Insets(5));
        stage.setScene(new Scene(stackPane, 300, 150));
        stage.setTitle("Drag and Drop");
        stage.show();
    }

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

}

获取 HTML 内容

    TextArea textArea = new TextArea();
        textArea.setPromptText("Drag text here");
        textArea.addEventHandler(
                DragEvent.DRAG_OVER,
                event -> {
                    if (event.getDragboard().hasHtml()) {
                        event.acceptTransferModes(TransferMode.COPY);
                    }
                    event.consume();
                });
        textArea.addEventHandler(
                DragEvent.DRAG_DROPPED,
                event -> {
                    Dragboard dragboard = event.getDragboard();
                    if (event.getTransferMode() == TransferMode.COPY && 
                            dragboard.hasHtml()) {
                        textArea.setText(dragboard.getHtml());
                        event.setDropCompleted(true);
                    }
                    event.consume();
                });

【讨论】:

  • 这看起来很有希望,谢谢沃伦。我一定会对其进行测试并报告。
  • 沃伦,效果很好,谢谢!是否可以轻松调整此代码,以便如果我将网站的内容拖到字段中,它提供 HTML 而不是文本?
  • 就这样,谢谢!我要彻底研究这些。赞赏
猜你喜欢
  • 2018-08-05
  • 1970-01-01
  • 2019-10-10
  • 2011-07-21
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2017-04-13
相关资源
最近更新 更多