我正在开发一个应用程序,其中我将一些链接添加到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());
但我不知道如何收听/跟踪不同链接的点击事件
老问题,老答案很好用,但有一点味道:它正在将视图(超链接)作为数据添加到ListView中。
更干净的替代方法是添加URL作为数据,并实现一个自定义单元格,该单元格使用超链接显示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;
});
// ...
}
我把一个工具提示到超链接并从那里读取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();
});
我给你做了一个很小的示例应用程序,
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);
}
}
如果在文本字段中输入新URL并单击按钮,新链接将添加到链接列表中,并显示在ListView上。每次添加新链接时,。setOnAction()
方法设置了要打开的正确URL。
也许你可以以此作为进一步开发应用程序的起点。
帕特里克
我最近实现了shouldInterceptRequest方法来检测链接的时间“http://sitemercado.com.br/valida“点击在android浏览器中打开它,而不是在webview中内部打开,直到它工作为止。链接在浏览器中打开,但当我回来查看webview应用程序时,它也被加载了,我希望它只在浏览器中加载。 我的代码如下: 我哪里做错了?
问题内容: 是否有任何(简单/内置方式)打开新浏览器(我的意思是默认的OS浏览器)窗口来查找Electron链接的方法,而不是访问您Electron应用程序中的链接? 问题答案: 您可以简单地使用:
问题内容: 有一个超链接。单击后,我希望在外部浏览器中打开链接。 网络上引用的常用方法似乎是: 但是我没有提及。该链接是从对话框打开的,该对话框是从控制器打开的,而该对话框是通过fxml文件打开的,因此获得对Application对象的引用将非常痛苦。 有人知道这样做的简单方法吗? 干杯 问题答案: 解决方案1:通过您的应用程序向下传递引用。 这可能类似于您预期的“非常痛苦”的方法。但基本上,您会
问题内容: <a target=”_blank” data-rel=”external” href="http://www.kidzout.com">www.kidzout.com 问题答案: 作为建议类似的问题,使用JavaScript来调用与参数设置为当按照InAppBrowser文档: 这应该起作用,尽管更好,更灵活的解决方案是拦截所有链接的事件,并使用从链接属性读取的参数进行调用。 请记住
我有一个非常简单的测试应用程序,上面有一个webview组件。我正试图阻止链接在浏览器中打开,但“shouldoverrideurlloading”看起来对我不起作用。 有人能帮我看看哪里有错误吗?
问题内容: 我如何在默认浏览器中单击按钮以打开以下链接: button.addActionListener(new ActionListener() { public void actionPerformed(ActionEvent e) { open("www.google.com”); // just what is the ‘open’ method? } }); ? 问题答案: 使用方法。