2013-05-17 13 views

Odpowiedz

3

Nie można tego zrobić, wydaje się, ponieważ ta funkcja nie jest zaimplementowana: https://javafx-jira.kenai.com/browse/RT-210

Chodzi o to, że ciebie nie będzie w stanie uruchomić niczego, co wymaga awt-stack i jfx w tej samej maszynie wirtualnej. Decyzja - należy użyć oddzielnej maszyny JVM. Wystarczy uruchomić oddzielną maszynę wirtualną i zaakceptuj polecenia podczas przeglądania przez gniazdo.

To jest jeden sposób, inny sposób - polega na znalezieniu innego sposobu wywoływania przeglądarki z java - jest to zadanie nieszczególne dla javafx-2, ale dla java w ogóle.

Ale deweloper dodał komentarz:

Anthony Pietrow dodaje komentarz - maja 17 2013 17:09 Zauważ, że FX8 pozwala headful AWT uruchomić w tym samym VM z FX. A więc interfejs AWT API powinien działać.

+0

to jest straszne: | Dzięki. Będę musiał załadować zawartość do aplikacji lub pozwolić użytkownikowi skopiować wklej adres URL? To jest potwór UX – Advanced

+0

Istnieje webView w JavaFX =) możesz załadować strony bezpośrednio w swojej aplikacji. –

+0

tak to jest to, co napisałem. – Advanced

34

Użyj hostServices.showDocument(location).

Spróbuj umieścić następujący kod w metodzie Uruchom aplikację za:

getHostServices().showDocument("http://www.yahoo.com"); 
+0

To zadziałało! wielkie dzięki. – Advanced

+0

A co z wywołaniem tej metody z innych klas? Mam przyciski w różnych "klasach kontrolerów fxml", które muszą otworzyć domyślną przeglądarkę na niektórych stronach internetowych, co mogę dla niej zrobić :)? – GOXR3PLUS

+0

W większości przypadków można dodać statyczny akcesor do podklasy ['Application'] (https://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html), która wywołuje' getHostServices () '.Jeśli nie chcesz używać metody statycznej i chcesz, aby kontrolery FXML były używane w wielu aplikacjach (np. Są to kontrolki biblioteki niezależne od aplikacji), musisz przekazać [instancję aplikacji do kontrolerów FXML] (http://stackoverflow.com/questions/14187963/passing-parameters-javafx-fxml). – jewelsea

13

Uzupełniając odpowiedź jewelsea za, jeśli nie wiem jak nazwać getHostServices(), a następnie spróbuj tego w głównej klasie:

HostServicesDelegate hostServices = HostServicesFactory.getInstance(this); 
hostServices.showDocument(WEBSITE); 

http://docs.oracle.com/javafx/2/api/javafx/application/HostServices.html#showDocument(java.lang.String)

+5

Należy zauważyć, że klasy takie jak HostServicesDelegate nie są częścią publicznie udokumentowanego API JavaFX i mogą nie być dostępne w późniejszych wersjach Java (takich jak Java 9). – jewelsea

7

Inną opcją jest użycie ProcessBuilder:

public static void openWebpage(String url) { 
    try { 
     new ProcessBuilder("x-www-browser", url).start(); 
    } catch (IOException e) { 
     e.printStackTrace(); 
    } 
} 

Możesz użyć tej opcji, jeśli Desktop.getDesktop().browse(uri) z jakiegoś powodu zawiesza się bez żadnego błędu.

1

Oto skrypt, który działa wewnątrz kontrolera sceny, gdy przycisk jest aktywny:

package sample; 


import com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory; 
import com.sun.javafx.application.HostServicesDelegate; 
import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.stage.Stage; 

public class Controller extends Application { 

    public void openBrowser(ActionEvent actionEvent) throws Exception { 

     HostServicesDelegate hostServices = HostServicesFactory.getInstance(this); 
     getHostServices().showDocument("http://www.yahoo.com"); 

    } 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

    } 
} 
0

Spróbuj to:

try { 
    Desktop.getDesktop().browse(new URL("https://google.com").toURI()); 
} catch (IOException e) { 
    e.printStackTrace(); 
} catch (URISyntaxException e) { 
    e.printStackTrace(); 
} 
Powiązane problemy