JavaFx 8: Öffnen Sie einen Link in einem Browser ohne Bezug zu Application

8

Habe einen Hyperlink. Wenn ich darauf klicke, möchte ich, dass ein Link in einem externen Browser geöffnet wird.

Die übliche im Web zitierte Methode scheint zu sein:

%Vor%

Ich habe jedoch keinen Verweis auf Application . Die Verknüpfung wird von Dialog aus geöffnet, der von einem Controller aus geöffnet wird, der über eine fxml-Datei geöffnet wird. Daher wäre es sehr schmerzhaft, einen Verweis auf das Application-Objekt zu erhalten.

Kennt jemand einen einfachen Weg, dies zu tun?

Prost

    
Ben 13.10.2015, 05:44
quelle

3 Antworten

14

Lösung 1: Übergeben Sie in Ihrer Anwendung einen Verweis auf HostServices down.

Dies ist wahrscheinlich ähnlich dem "ziemlich schmerzhaften" Ansatz, den Sie erwarten. Aber im Grunde würden Sie etwas tun wie:

%Vor%

und dann in MainController :

%Vor%

und natürlich DialogController sieht so aus:

%Vor%

Lösung 2: Verwenden Sie eine Controller-Factory, um die Host-Dienste an die Controller zu übertragen.

Dies ist eine sauberere Version des oben genannten. Anstatt die Controller zu ermitteln und eine Methode aufzurufen, um sie zu initialisieren, konfigurieren Sie die Erstellung der Controller über controllerFactory und erstellen Sie Controller, indem Sie ein HostServices -Objekt an den Konstruktor des Controllers übergeben, wenn es einen passenden Konstruktor hat:

%Vor%

Verwenden Sie jetzt die Controller-Factory, wenn Sie den FXML laden:

%Vor%

und definieren Sie Ihre Controller, um HostServices als Konstruktorparameter zu verwenden:

%Vor%

und natürlich

%Vor%

Lösung 3: Das ist eine kläglich hässliche Lösung, und ich empfehle dringend, sie nicht zu benutzen. Ich wollte es nur einbeziehen, damit ich das ausdrücken kann, ohne jemanden zu beleidigen als sie es gepostet haben. Speichern Sie die Host-Services in einem statischen Feld.

%Vor%

Dann machst du es einfach

%Vor%

wo immer du willst. Eines der Probleme besteht darin, dass Sie für alle Controller, die Zugriff auf die Host-Dienste benötigen, eine Abhängigkeit von Ihrem Anwendungstyp einführen müssen.

Lösung 4 Definieren Sie ein Singleton HostServicesProvider . Dies ist besser als Lösung 3, aber immer noch keine gute Lösung imo.

%Vor%

Jetzt brauchen Sie nur

%Vor%

und

%Vor%

Lösung 5 Verwenden Sie ein Abhängigkeitsinjektions-Framework. Dies trifft wahrscheinlich nicht auf Ihren aktuellen Anwendungsfall zu, könnte Ihnen aber eine Vorstellung davon geben, wie mächtig diese (relativ einfachen) Frameworks sein können.

Wenn Sie beispielsweise afterburner.fx verwenden, müssen Sie nur

ausführen %Vor%

in Ihrer Anwendung start() oder init() Methode und dann

%Vor%

Ein Beispiel mit Spring ist hier .

    
James_D 13.10.2015, 11:01
quelle
3

Wenn Sie eine URL öffnen möchten, wenn Sie auf eine Schaltfläche in Ihrer App klicken und eine fxml-Controller-Datei verwenden, können Sie Folgendes tun ...

Zuerst in Ihrer Main Application Startup-Datei erhalten Sie einen Zeiger auf das HostServices-Objekt und fügen Sie es zu Ihrer Bühne wie ...

hinzu %Vor%

Rufen Sie dann in Ihrer fxml-Controller-Datei das hostServices-Objekt vom stage-Objekt ab und führen Sie dann die showDocument () -Methode aus.

%Vor%

Ich habe eine Methode in meiner contoller-Klasse namens getStage () ...

%Vor%     
Peter 09.12.2015 15:05
quelle
1

Eine andere Möglichkeit wäre, java.awt.Desktop zu verwenden

Versuch (ungetestet):

%Vor%

Beachten Sie jedoch, dass dies eine Abhängigkeit zum AWT-Stack darstellt. Dies ist wahrscheinlich kein Problem, wenn Sie mit der vollständigen JRE arbeiten, aber es könnte ein Problem werden, wenn Sie mit einer maßgeschneiderten JRE (Java SE 9 & Jigsaw) arbeiten möchten oder wenn Sie Ihre Anwendung auf einem mobilen Gerät ausführen möchten ( javafxports ).

Es gibt ein offenes Problem für Desktop in JavaFX unterstützen in der Zukunft.

    
Puce 13.10.2015 08:11
quelle

Tags und Links