javafx: отобразить гиперссылку в ячейке таблицы - PullRequest
0 голосов
/ 31 мая 2018

Я новичок в JAVAFX и пытаюсь отобразить гиперссылку в ячейке таблицы.Я мог бы отображаться как гиперссылка, но не смог открыть ссылку.

Пожалуйста, найдите логику для того же.

Основной метод идет здесь: *

 public class Main extends Application {
    private BorderPane root;
    private TableView<Item> table;
    private Scene scene;
    private TableColumn<Item, String> nameColumn;
    private TableColumn<Item, Hyperlink> urlColumn;
    private ObservableList<Item> websiteList;


@Override
public void start(Stage primaryStage) {

    root = new BorderPane();
    //scene = new Scene(root, 400, 400);

    table = new TableView<Item>();

    //root.setCenter(table);
    nameColumn = new TableColumn<>("Name");

    nameColumn.setCellValueFactory(new PropertyValueFactory<>("websiteName"));

    urlColumn = new TableColumn<>("Address");
    urlColumn.setCellValueFactory(new PropertyValueFactory<>("hyperlink"));
    urlColumn.setCellFactory(new HyperlinkCell());

    table.getColumns().add(nameColumn);
    table.getColumns().add(urlColumn);
    websiteList = FXCollections.observableArrayList();
    websiteList.add(new Item("Google", "https://www.google.co.in/"));
    websiteList.add(new Item("Facebook", "www.facebook.com"));
    websiteList.add(new Item("Superglobals", "www.superglobals.net"));

    Hyperlink hyperlink = new Hyperlink("Go to Eclipse home page");

    hyperlink.setOnAction(new EventHandler<ActionEvent>() {

        @Override
        public void handle(ActionEvent event) {
            getHostServices().showDocument("https://www.google.co.in/");
        }
    });
    root.getChildren().addAll(hyperlink);
   // root.setBottom(hyperlink);
    table.setItems(websiteList);
    root.setCenter(table);
    scene = new Scene(root, 400, 400);
    primaryStage.setScene(scene);
    primaryStage.show();
}

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

}

Item.java ::

public class Item {
    private String websiteName;
    private Hyperlink hyperlink;

    public Item(String websiteName, String websiteUrl) {
        this.websiteName = websiteName;
        this.hyperlink = new Hyperlink(websiteUrl);
    }

    public String getWebsiteName() {
        return websiteName;
    }

    public void setWebsiteName(String websiteName) {
        this.websiteName = websiteName;
    }

    public Hyperlink getHyperlink() {
        return hyperlink;
    }

    public void setHyperlink(String websiteUrl) {
        this.hyperlink = new Hyperlink(websiteUrl);
    }
}

HyperlinkCell.java ::

public class HyperlinkCell implements  Callback<TableColumn<Item, Hyperlink>, TableCell<Item, Hyperlink>> {
 private static HostServices hostServices ;

    public static HostServices getHostServices() {
        return hostServices ;
    }
@Override
public TableCell<Item, Hyperlink> call(TableColumn<Item, Hyperlink> arg) {
    TableCell<Item, Hyperlink> cell = new TableCell<Item, Hyperlink>() {
        @Override
        protected void updateItem(Hyperlink item, boolean empty) {
            super.updateItem(item, empty);
            setGraphic(empty ? null : item);
        }
    };
    return cell;
}

}

Вывод отображается так, но яне удалось открыть гиперссылку.Пожалуйста, помогите нам в этом.

enter image description here

Спасибо.

1 Ответ

0 голосов
/ 31 мая 2018

Просто обновите обработчик onAction гиперссылки в методе updateItem():

TableCell<Item, Hyperlink> cell = new TableCell<Item, Hyperlink>() {
    @Override
    protected void updateItem(Hyperlink item, boolean empty) {
        super.updateItem(item, empty);
        setGraphic(empty ? null : item);
        if (! empty) {
            item.setOnAction(e -> {
                // handle event here...
            });
        }
    }
};

Обратите внимание, что на самом деле не очень хорошая идея использовать элементы пользовательского интерфейса (например, Hyperlink) в вашем данные классы (например, Item).Я рекомендую вам выполнить рефакторинг так, чтобы Item содержал только данные:

public class Item {
    private String websiteName;
    private String url;

    public Item(String websiteName, String websiteUrl) {
        this.websiteName = websiteName;
        this.url = websiteUrl;
    }

    public String getWebsiteName() {
        return websiteName;
    }

    public void setWebsiteName(String websiteName) {
        this.websiteName = websiteName;
    }

    public String getUrl() {
        return url;
    }

    public void setUrl(String websiteUrl) {
        this.url = websiteUrl;
    }
}

А затем:

private TableColumn<Item, String> urlColumn;

// ...

urlColumn = new TableColumn<>("Address");
urlColumn.setCellValueFactory(new PropertyValueFactory<>("url"));
urlColumn.setCellFactory(new HyperlinkCell());

Где-то в start() вам нужно сделать

HyperlinkCell.setHostServices(getHostServices());

и, наконец, определите Hyperlink в ячейке.Таким образом, существует только один Hyperlink экземпляр на ячейку , вместо одного на каждый элемент в таблице.

public class HyperlinkCell implements  Callback<TableColumn<Item, Hyperlink>, TableCell<Item, Hyperlink>> {

    private static HostServices hostServices ;

    public static HostServices getHostServices() {
        return hostServices ;
    }

    public static void setHostServices(HostServices hostServices) {
        HyperlinkCell.hostServices = hostServices ;
    }

    @Override
    public TableCell<Item, String> call(TableColumn<Item, String> arg) {
        TableCell<Item, Hyperlink> cell = new TableCell<Item, Hyperlink>() {

            private final Hyperlink hyperlink = new Hyperlink();

            {
                hyperlink.setOnAction(event -> {
                    String url = getItem();
                    hostServices.showDocument(url);
                });
            }

            @Override
            protected void updateItem(String url, boolean empty) {
                super.updateItem(url, empty);
                if (empty) {
                    setGraphic(null);
                } else {
                    hyperlink.setText(url);
                    setGraphic(hyperlink);
                }
            }
        };
        return cell;
    }

}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...