【问题标题】:javafx: display hyperlink in table celljavafx:在表格单元格中显示超链接
【发布时间】:2018-05-31 10:57:18
【问题描述】:

我是 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;
}

}

输出显示如下,但无法打开超链接。请帮助我们。

谢谢。

【问题讨论】:

    标签: javafx


    【解决方案1】:

    只需更新updateItem()方法中超链接的onAction处理程序即可:

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

    请注意,在 data 类(例如 Item)中使用 UI 元素(例如 Hyperlink)确实不是一个好主意。我建议你重构它,以便 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。这样每个cell只有一个Hyperlink实例,而不是表中的每个item都有一个。

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

    【讨论】:

    • 谢谢它的工作。我想在带有超链接的表格中只显示一个列单元格,然后单击它应该在新窗口中显示一些文本。请帮我解决这个问题
    猜你喜欢
    • 2012-03-01
    • 1970-01-01
    • 2021-11-20
    • 2021-07-20
    • 1970-01-01
    • 1970-01-01
    • 2018-06-30
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多