2014-09-02 53 views
1

我正在嘗試將JavaFX WebView集成到我的應用程序中。JavaFX中的桌面類

問題是我想在默認瀏覽器中打開鏈接,而不是在WebView中打開鏈接。

我搜索了很多,每個人都在談論桌面類,所以我試了一下。

這是我現在相關的代碼:

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文件管理器打開的值的例子嗎? – 2014-09-02 12:01:50

+0

我已經做了調試。 newValue包含與常量完全相同的值。此外,我插入了一個newValue.equals(常量)和它的真實。 – galovics 2014-09-02 13:44:58

回答

2

我不知道爲什麼它的行爲與java.awt.Desktop#browse(URI),但我發現有一個使用HostServices類的原生JavaFX解決方案。既然你使用的是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"); 
    } 
} 

需要注意的是,據我所知,你只能從你的JavaFX ApplicationgetHostServices()方法得到HostServices

+0

我不是100%確定的,但我認爲如果您正在運行嵌入在網頁(Applet)中的JavaFX應用程序,則只能使用HostServices。 – Puce 2014-09-03 11:02:27

+0

我試過了,發生同樣的問題。即使我試圖將我的Java從8u20降級到8u11,因爲我在關閉JavaFX應用程序時遇到了管道問題。 (也許是一個錯誤,因爲它好像現在不出現) – galovics 2014-09-03 11:12:23

相關問題