【问题标题】:When Click on Hyperlinks in JavaFX ,a relevant URL should open in browser单击 JavaFX 中的超链接时,应在浏览器中打开相关 URL
【发布时间】:2014-08-18 08:06:58
【问题描述】:

我正在开发一个应用程序,其中我将一些链接添加到 Listview 中,并且这些链接将在运行时在某些情况下继续添加。所以我找不到一种在单击时如何打开 url 的方法一个特定的链接。

这是在列表视图中添加链接的代码

    if(counter==1)
                {
                    Task task2 = new Task<Void>() {
                          @Override
                          public Void call() throws Exception {

                              Platform.runLater(new Runnable() {
                                public void run() {
                                     link=new Hyperlink(val);
                                    link.setStyle("-fx-border-style: none;");
                                    items.add(link);
                                    listview.setItems(items);



                                }
                              });


                            return null;

                          }
                        };
                        Thread th = new Thread(task2);
                        th.setDaemon(true);
                        th.start(); 
                        Thread.sleep(1000);


                }

我知道点击链接时我需要使用类似的东西在浏览器中打开一个网址

 getHostServices().showDocument(link.getText()); 

但我不知道如何监听/跟踪不同链接的点击事件

【问题讨论】:

    标签: java javafx javafx-2 desktop-application


    【解决方案1】:

    我为你做了一个非常小的示例应用程序,

    import java.util.ArrayList;
    import java.util.List;
    import javafx.application.Application;
    import javafx.event.ActionEvent;
    import javafx.event.EventHandler;
    import javafx.scene.Scene;
    import javafx.scene.control.Button;
    import javafx.scene.control.Hyperlink;
    import javafx.scene.control.ListView;
    import javafx.scene.control.TextField;
    import javafx.scene.layout.AnchorPane;
    import javafx.scene.layout.HBox;
    import javafx.scene.layout.VBox;
    import javafx.stage.Stage;
    
    public class ListList extends Application {
    
        final ListView listView = new ListView();
        @Override
        public void start(Stage primaryStage) {
    
            List<Hyperlink> links = new ArrayList<>();
    
            AnchorPane pane = new AnchorPane();
            VBox vBox = new VBox();
            final Hyperlink link = new Hyperlink("http://blog.professional-webworkx.de");
            Hyperlink link2= new Hyperlink("http://www.stackoverflow.com");
    
            links.add(link);
            links.add(link2);
    
            for(final Hyperlink hyperlink : links) {
                hyperlink.setOnAction(new EventHandler<ActionEvent>() {
    
                    @Override
                    public void handle(ActionEvent t) {
                        getHostServices().showDocument(hyperlink.getText());
                    }
                });
            }
    
            listView.getItems().addAll(links);
            HBox hBox = new HBox();
            final TextField urlField = new TextField();
            Button b = new Button("Add Links");
            hBox.getChildren().addAll(b, urlField);
    
            b.setOnAction(new EventHandler<ActionEvent>() {
    
                @Override
                public void handle(ActionEvent t) {
                    addLink(urlField.getText().trim());
                    urlField.clear();
                }
            });
            vBox.getChildren().add(hBox);
            vBox.getChildren().add(listView);
            pane.getChildren().add(vBox);
            Scene scene = new Scene(pane, 800, 600);
            primaryStage.setTitle("Hello World!");
            primaryStage.setScene(scene);
            primaryStage.show();
        }
    
        /**
         * @param args the command line arguments
         */
        public static void main(String[] args) {
            launch(args);
        }
    
        private void addLink(final String url) {
            final Hyperlink link = new Hyperlink(url);
            link.setOnAction(new EventHandler<ActionEvent>() {
    
                @Override
                public void handle(ActionEvent t) {
                    getHostServices().showDocument(link.getText());
                    //openBrowser(link.getText());
                }
    
            });
            listView.getItems().add(link);
        }
    
        private void openBrowser(final String url) {
            getHostServices().showDocument(url);
        }
    }
    

    如果您在 TextField 中输入新的 URL 并单击按钮,新的链接将被添加到您的 LinkList 中,并将显示在 ListView 上。每次添加新链接时,.setOnAction() 方法都会设置正确的 URL 以打开。

    也许您可以以此为起点进一步开发您的应用。

    帕特里克

    【讨论】:

    • 感谢您的帮助帕特里克。我会尝试在我的逻辑中应用它:)
    • @AnishSharma 没问题,返回更多代码,您通常会在 SO 上看到您应该发布 MCVE 以更快地获得帮助。
    • 不,它没有!但我已经设法解决了。这是一个有点冗长的解决方案,但可以达到目的。
    • getHostServices 是我今天的学习项目 :) 吹毛求疵:您不会在列表中添加超链接 - 相反,将 url 列表作为数据和自定义单元工厂使用超链接来显示 url并根据需要触发打开url
    【解决方案2】:

    我在超链接上放置了一个工具提示并从那里读取了 url,并且似乎可以正常工作。即:

    Hyperlink hl = new Hyperlink(sometext);
    hl.setTooltip(new Tooltip(theurlhere);
    hl.setOnAction((ActionEvent event) -> {
        Hyperlink h = (Hyperlink) event.getTarget();
        String s = h.getTooltip().getText();
        getHostServices.showDocument(s);
        event.consume();
    });
    

    【讨论】:

      【解决方案3】:

      旧问题,旧答案,工作正常 - 但有一点味道:它将视图(超链接)作为数据添加到 ListView。

      更简洁的替代方法是将 URL 添加为数据并实现一个自定义单元格,该单元使用超链接来显示(并允许与之交互)这些 URL。

      快速代码示例:

      final ListView<URL> listView = new ListView<>();
      
      @Override
      public void start(Stage primaryStage) throws MalformedURLException {
      
          ObservableList<URL> urls = FXCollections.observableArrayList(
                new URL("http://blog.professional-webworkx.de"),
                new URL("http://www.stackoverflow.com")
                  );
      
          listView.getItems().addAll(urls);
          listView.setCellFactory(c -> {
              ListCell<URL> cell = new ListCell<>() {
                  private Hyperlink hyperlink;
      
                  {
                      hyperlink = new Hyperlink();
                      hyperlink.setOnAction(e -> {
                          if (getItem() != null) {
                              getHostServices().showDocument(getItem().toString());
                          }
                      });
                      setContentDisplay(ContentDisplay.GRAPHIC_ONLY);
                  }
      
                  @Override
                  protected void updateItem(URL item, boolean empty) {
                      super.updateItem(item, empty);
                      if (item != null && !empty) {
                          hyperlink.setText(item.toString());
                          setGraphic(hyperlink);
                      } else {
                          setGraphic(null);
                      }
                  }
      
              };
              return cell;
          });
         // ... 
      }
      

      【讨论】:

        猜你喜欢
        • 2015-11-01
        • 1970-01-01
        • 2016-08-29
        • 2023-03-19
        • 2012-12-15
        • 2023-03-03
        • 2012-01-29
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多