【问题标题】:JavaFx - extracting the url from a string and making the url clickableJavaFx - 从字符串中提取 url 并使 url 可点击
【发布时间】:2020-09-22 19:19:29
【问题描述】:

我尝试实施一些现有的解决方案,但对我没有帮助。 从 API 接收到一个字符串“您可以访问网站:http://localhost:0000/stack_overflow/”。 需要显示整个字符串。 我想以这样一种方式拆分字符串,使“http://localhost:0000/stack_overflow/”部分成为超链接并可点击。

我尝试使用 TextFlow 并将文本拆分为文本和超链接,但是,当我使用“:”进行拆分时,所有的“:”都会破坏字符串。

String urlLink = "You can visit out website:http://localhost:0000/stack_overflow/";
TextFlow textFlow = new TextFlow();
ImageView imageView = new ImageView();
imageView.setImage(new Image(Resources.ICON));
String[]  information = urlLink.split(":");
Text      txtInfo     = new Text(information[0]);
Hyperlink link        = new Hyperlink(information[1]);
link.setOnAction(event -> {
   try {
    Runtime.getRuntime().exec("cmd.exe /c start iexplore " + link);
   } catch (IOException e) {
     e.printStackTrace();
   }
});
textFlow = new TextFlow(txtInfo, link);

【问题讨论】:

  • 收到的字符串有时可能没有空格。而且当我拆分时,我仍然希望“:”在显示屏上可见。
  • 因此,您代码中的所有 JavaFX 内容都与您的问题无关,即如何在正确的位置 split 一个字符串。代码示例甚至不一致,因为它以声明名为 urlLink 的变量开始,但随后突然使用 description.getCaption() 代替变量。一个简单的解决方案是urlLink.split("(?=https?:)");,在http:https: url 开头之前进行拆分。

标签: java javafx java-8 hyperlink


【解决方案1】:

您可以使用String.split() 的重载版本,它允许您指定拆分中项目数的限制。 (这几乎就是链接文档中表格第一行中的示例。)

String[]  information = description.getCaption().split(":", 2);

要在文本中显示冒号,只需将其连接回:

Text      txtInfo     = new Text(information[0] + ":");

请注意,在系统浏览器中显示 URL 的更好的、独立于平台的方法是使用 getHostServices().showDocument(...)getHostServices() 方法可从您的 Application 实例中获得;有关如何将HostServices 提供给应用程序的其他部分的详细信息,请参阅JavaFx 8: open a link in a browser without reference to Application

String urlLink = "You can visit our website:http://localhost:0000/stack_overflow/";
TextFlow textFlow = new TextFlow();
String[]  information = description.getCaption().split(":", 2);
Text      txtInfo     = new Text(information[0] + ":");
Hyperlink link        = new Hyperlink(information[1]);
link.setOnAction(event -> getHostServices().showDocument(information[1]));
textFlow = new TextFlow(txtInfo, link);

【讨论】:

    【解决方案2】:

    您可以通过" : " 上的正则表达式拆分来解决问题(冒号周围有空格)。 (正如 @James_D 在 cmets 中所建议的)

    无论如何,我想指出一个在打开网页时调用 Java 的好方法是

    try {
        Desktop.getDesktop().browse(new URL("https://google.com").toURI());
    } catch (IOException e) {
        e.printStackTrace();
    } catch (URISyntaxException e) {
        e.printStackTrace();
    }
    

    您根本不需要运行时。

    编辑:由于“java-8”标签,我认为他正在使用 Java 8 (jre & jdk),我已经为此量身定制了我的答案。正如@James_D 所指出的,这在 Java 9 及更高版本中无效,因为您必须明确声明对 java.desktop 模块的依赖,如果您为应用程序链接特定图像,这会增加很多体积。

    【讨论】:

    • 除非需要,否则不要混合 UI 工具包。 Desktop 是 AWT 的一部分,而不是 JavaFX。使用getHostServices().showDocument(...)
    • getHostServices().showDocument(...) 不是处理它的好方法。这里的问题之一是您为需要访问主机服务的所有控制器引入了对应用程序类型的依赖关系。您可以在这里查看更多信息:(stackoverflow.com/questions/33094981/…) 无论如何,我不想展开辩论。是的,这将引入对 AWT 堆栈的依赖关系。如果您使用的是完整的 JRE,这可能不是问题。
    • 我对那篇文章非常熟悉...当然,对您编写的类的依赖比对整个工具包的依赖要好。您的论点“如果您正在使用完整的 JRE”在 Java 9 及更高版本中无效,因为您必须明确声明对 java.desktop 模块的依赖关系,如果您要链接特定图像,这会增加很多体积为您的应用程序。
    • 如果他使用“java-8”标签,我假设他正在使用 Java 8 (jre & jdk)。我为此量身定制了答案。无论如何感谢您的建议。
    • 嗯,这是一个公平的观点 - 我没有注意到那个标签。你能edit这个问题并简要说明一下吗?
    猜你喜欢
    • 2011-08-08
    • 2011-05-22
    • 2016-06-16
    • 2012-06-07
    • 1970-01-01
    • 1970-01-01
    • 2011-08-30
    • 1970-01-01
    相关资源
    最近更新 更多