Как использовать platform.runlater(), чтобы отключить ссылку / гиперссылку / навигацию в одном веб-просмотре и открыть эту ссылку / гиперссылку / навигацию в другом веб-просмотре в java
[для справки я прикрепил скриншот своего приложения, если вы видите, что открытая страница тоже такая же, а внизу тоже та же, поэтому мне нужно остановить навигацию по вышеуказанному веб-представлению, чтобы она могла открываться только вниз) [1]
public class HV extends Application
{
@Override
public void start(Stage primaryStage) throws Exception
{
StackPane root = new StackPane();
HBox hbox = new HBox(30); // create a HBox to hold 2 vboxes
// create a vbox with a textarea that grows vertically
VBox vbox = new VBox(10);
final WebView img = new WebView();
final WebEngine webEngineImg = img.getEngine();
vbox.getChildren().addAll(img);
// create a vbox that grows horizontally inside the hbox
VBox vbox2 = new VBox();
final WebView browser = new WebView();
final WebEngine webEngine = browser.getEngine();
final WebView browser1 = new WebView();
final WebEngine webEngine1 = browser1.getEngine();
webEngine1.getLoadWorker().stateProperty()
.addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
if (newState == Worker.State.SUCCEEDED) {
primaryStage.setTitle(webEngine1.getLocation());
String trgurl=webEngine1.getLocation();
System.out.println(trgurl);
if(trgurl.matches("(.*)img=(.*)")){
int n = trgurl.indexOf("img=");
//String str1 = Integer.toString(n);
System.out.println(n+4);
int len = trgurl.length();
System.out.println("string length is: "+trgurl.length());
System.out.println(trgurl.substring(n+4,len));
String find = "file:"+trgurl.substring(n+4,len);
System.out.println(find);
webEngineImg.load(find);
//webEngine1.load(find);// this is loading image
if (trgurl.matches("(.*)target=wb2(.*)")){
//int n1= trgurl.indexOf("target=");
//String str1 = Integer.toString(n);
// System.out.println(n1+7);
// System.out.println(trgurl.substring(n1+7,98));
boolean cancel();
webEngine.load("url");
}
}
}
}
});
webEngine1.load("url");
// String url = "https://eclipse.org";
// Load a page from remote url.
// webEngine.load(url);
vbox2.setPadding(new Insets(3));
vbox2.setSpacing(3);
vbox2.getChildren().addAll( browser1,browser);
HBox.setHgrow(vbox2, Priority.ALWAYS);
hbox.setPadding(new Insets(20));
// StackPane.setMargin(hbox, new Insets(20));
hbox.getChildren().addAll(vbox, vbox2);
root.getChildren().add(hbox);
Scene scene = new Scene(root, 500, 300); // the stack pane is the root node
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args)
{
Application.launch(args);
}
}
для отладки - это мой код, у которого три открытых веб-просмотра в webview1 полный сайт открыт и в webviewimg только изображения из действия webview1 open и в webview я хочу загрузить URL редактирования, но для этого мне нужно отключить навигацию по этой ссылке в webview1, чтобы я мог открыть это в webview, поэтому я попробовал platform.runlater, чтобы запустить эту ссылку после в другом webview, но я получаю сообщение об ошибке, что состояние не может быть изменено на строку, это кусок кода, где я пытаюсь добавить
webEngine1.getLoadWorker().stateProperty()
.addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
if (newState == Worker.State.SUCCEEDED) {
primaryStage.setTitle(webEngine1.getLocation());
String trgurl=webEngine1.getLocation();
System.out.println(trgurl);
if ((address.getQuery() + "").contains("target=true"))
{
Platform.runLater(() -> {
grid_layout.getChildren().remove(webEngine1);
grid_layout.add(webEngine1, 0, 1);
webEngine1.load(oldState);
или как вставить JQuery в Java, чтобы предотвратить навигационный код здесь
document.addEventListener('click', function(e) {
e.stopPropagation();
}, true);
1 ответ
Задача решена. Вот код:
public class HV extends Application
{
@Override
public void start(Stage primaryStage) throws Exception
{
StackPane root = new StackPane();
HBox hbox = new HBox(30); // create a HBox to hold 2 vboxes
// create a vbox with a textarea that grows vertically
VBox vbox = new VBox(10);
final WebView img = new WebView();
final WebEngine Img = img.getEngine();
vbox.getChildren().addAll(img);
// create a vbox that grows horizontally inside the hbox
VBox vbox2 = new VBox();
final WebView browser = new WebView();
final WebEngine wb2 = browser.getEngine();
final WebView browser1 = new WebView();
final WebEngine wb1 = browser1.getEngine();
wb1.getLoadWorker().stateProperty()
.addListener(new ChangeListener<Worker.State>() {
@Override
public void changed(ObservableValue ov, Worker.State oldState, Worker.State newState) {
Platform.runLater(() -> {
final WebEngine wb1 = browser1.getEngine();
if (wb1.getLocation().contains("img")) {
System.out.println("BrowserPane.ChangeListener cancelling " + wb1.getLocation());
wb1.getLoadWorker().cancel();
// if (newState == Worker.State.SCHEDULED) {
primaryStage.setTitle(wb1.getLocation());
String trgurl = wb1.getLocation();
System.out.println(trgurl);
if(trgurl.matches("(.*)img=(.*)")){
int n = trgurl.indexOf("img=");
//String str1 = Integer.toString(n);
System.out.println(n+4);
int len = trgurl.length();
System.out.println("string length is: "+trgurl.length());
System.out.println(trgurl.substring(n+4,len));
String find = "file:"+trgurl.substring(n+4,len);
System.out.println(find);
Img.load(find);
//webEngine1.load(find);// this is loading image
if (trgurl.matches("(.*)target=wb2(.*)")){
int n1= trgurl.indexOf("target=wb2");
String str1 = Integer.toString(n1+10);
System.out.println(n1+10);
System.out.println(trgurl.substring(0,n1+10));
String find1= ""+trgurl.substring(0,n1+10);
System.out.println(find1);
// boolean cancel();
wb2.load(find1);
}
}
}
});
}
});
wb1.load("url");
// String url = "https://eclipse.org";
// Load a page from remote url.
// webEngine.load(url);
vbox2.setPadding(new Insets(3));
vbox2.setSpacing(3);
vbox2.getChildren().addAll( browser1,browser);
HBox.setHgrow(vbox2, Priority.ALWAYS);
hbox.setPadding(new Insets(20));
// StackPane.setMargin(hbox, new Insets(20));
hbox.getChildren().addAll(vbox, vbox2);
root.getChildren().add(hbox);
Scene scene = new Scene(root, 500, 300); // the stack pane is the root node
primaryStage.setScene(scene);
primaryStage.show();
}
public static void main(String[] args)
{
Application.launch(args);
}
}
С помощью platform.runlater() и после того, как слушатель отменит загрузчик с помощью getloadworker.cancel()