2014-09-02 5 views
1

Я пытаюсь интегрировать JavaFX WebView в свое приложение.Рабочий класс в JavaFX

Проблема в том, что я хочу открывать ссылки в браузере по умолчанию, а не в WebView.

Я много гулял, и все говорят о классе Desktop, поэтому я попробовал.

Вот мой соответствующий код Сейчас:

webView.getEngine().locationProperty() 
      .addListener(new ChangeListener<String>() { 

       @Override 
       public void changed(
         ObservableValue<? extends String> observable, 
         String oldValue, String newValue) { 
        Platform.runLater(() -> webView.getEngine().loadContent(content.get())); 
        new Thread() { 
         @Override 
         public void run() { 
          BrowserOpener.open(newValue); 
         } 
        }.start(); 
       } 
      }); 

Тем не менее, кажется, работает, но есть одна проблема. . WebView.getEngine() locationProperty() .addListener (новый ChangeListener() {

   @Override 
       public void changed(
         ObservableValue<? extends String> observable, 
         String oldValue, String newValue) { 
        Platform.runLater(() -> webView.getEngine() 
          .loadContent(content.get())); 
        new Thread() { 
         @Override 
         public void run() { 
          BrowserOpener.open(newValue); 
         } 
        }.start(); 
       } 
      }); 

BrowserOpener:

public static void open(String uriString) { 
    openUri(URI.create(uriString)); 
} 
public static void openUri(URI uri) { 
    if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) { 
     try { 
      desktop.browse(uri); 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
    } 
} 

Тем не менее, кажется, работает, но есть одна проблема, если я запустить это приложение. и нажмите на ссылку, браузер по умолчанию открывает ссылку, но вот проблема. Также открывает менеджер файлов Windows.

Если изменить BrowserOpener.open(newValue) к BrowserOpener.open("http://google.com") он работает нормально.

У вас есть идеи?

Спасибо.

+0

Можете ли вы записать строку 'newValue' и опубликовать некоторые примеры значений, которые открываются файловым менеджером Windows? –

+0

Я уже отлаживал. NewValue содержит точно такое же значение, как и константа. Также я вставил newValue.equals (constant) и его true. – galovics

ответ

2

Я не знаю, почему он ведет себя таким образом с java.awt.Desktop#browse(URI), но я обнаружил, что существует собственное решение JavaFX с использованием класса HostServices. Поскольку вы используете JavaFX, в любом случае это может быть лучшей идеей. Вот пример, который я только что попробовал:

import javafx.application.Application; 
import javafx.application.HostServices; 
import javafx.stage.Stage; 

public class BrowseTest extends Application { 
    public static void main(String[] args) { 
     launch(args); 
    } 

    @Override 
    public void start(Stage arg0) throws Exception { 
     HostServices host = getHostServices(); 
     host.showDocument("http://google.com"); 
    } 
} 

Обратите внимание, что, насколько я знаю, вы можете получить только HostServices от вашего getHostServices() метода JavaFX Application «s.

+0

Я не уверен на 100%, но я думаю, что вы можете использовать HostServices только в том случае, если вы используете приложение JavaFX, встроенное в веб-страницу (апплет). – Puce

+0

Я попробовал, и эта проблема возникла. Даже я пытался понизить свою Java до 8u11 с 8u20, так как у меня проблема с конвейером, когда я закрываю приложение JavaFX. (может быть, ошибка, потому что кажется, что она не появляется сейчас) – galovics

Смежные вопросы