Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

When Click on Hyperlinks in JavaFX ,a relevant URL should open in browser

I am developing an application in which I have some links added to the Listview, and these links will keep on adding at runtime on some condition. What I can't find is a way to to open a url when clicking on a particular link.

This is the code for adding links into list view

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

I know I need to use something like this to open a url in browser when click on link:

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

I don't know how to listen/track the click event for different links.

like image 800
Anish Sharma Avatar asked Dec 05 '22 06:12

Anish Sharma


2 Answers

I made a very small example Application for you,

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

If you enter a new URL in the TextField and click on the Button, the new Link will be added to your LinkList and will be displayed on the ListView. Everytime you add a new Link, the .setOnAction() Method is set with the right URL to open.

Maybe you can use this as starting point for further developing your app.

Patrick

like image 75
Patrick Avatar answered Apr 29 '23 17:04

Patrick


I put a Tooltip to the hyperlink and read the url from there, and seems to work. i.e.:

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();
});
like image 30
Kaj Risberg Avatar answered Apr 29 '23 16:04

Kaj Risberg