2016-10-06 29 views
1

HostServicesを使用してデフォルトブラウザでリンクを開く方法が見つかりました。JavaFXから外部アプリケーションを開く

getHostServices().showDocument("http://www.google.com"); 
  • デフォルトのメディアプレーヤーでメディアを開く方法はありますか?
  • 特定の方法を起動する方法はありますかファイルまたはアプリケーション
+1

特定のドキュメントにマップするURL(file:// URLを含む)を使用して試した場合は、そのドキュメントタイプのデフォルトアプリケーションでドキュメントを開きます。メディアなどで同じように動作しませんか?合理的に行うことができれば、AWTとJavaFXの混在を避ける方が良いでしょう。 –

+0

はい、 'file://'が含まれていると 'IllegalArgumentException'に直面しています。私はあなたのコメントを読む前にAWTからのものであることに気付かなかった。あなたの答えを共有していただければ幸いです。私はJavaFXでこれを行うことができます。私の知識と経験も豊かになります。 –

+0

さて、もう一度テストしたところ、file:// URLで動作しますが、http:URLを持つ他のドキュメントタイプでは動作しません(ファイルをダウンロードするブラウザが開きます)。答えを追加しますが、Webサーバーからダウンロードしたメディアを開くには、その方法がないとわかりません。 –

答えて

2

は、あなたが参照さHostServices.showDocument(...)方法が行うには、「純粋のJavaFX」方法を提供しますこの。 Webサーバーからファイルをダウンロードし、既定のアプリケーションで開くことはできません(私が知る限り)。

デフォルトのアプリケーションでファイルを開くには、ファイルをfile: URLの文字列表現に変換する必要があります。ここでは簡単な例です:

import java.io.File; 

import javafx.application.Application; 
import javafx.event.ActionEvent; 
import javafx.event.EventHandler; 
import javafx.geometry.Insets; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.scene.control.Label; 
import javafx.scene.control.TextField; 
import javafx.scene.layout.HBox; 
import javafx.scene.layout.VBox; 
import javafx.stage.FileChooser; 
import javafx.stage.Stage; 

public class OpenResourceNatively extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     TextField textField = new TextField("http://stackoverflow.com/questions/39898704"); 
     Button openURLButton = new Button("Open URL"); 
     EventHandler<ActionEvent> handler = e -> open(textField.getText()); 
     textField.setOnAction(handler); 
     openURLButton.setOnAction(handler); 

     FileChooser fileChooser = new FileChooser(); 
     Button openFileButton = new Button("Open File..."); 
     openFileButton.setOnAction(e -> { 
      File file = fileChooser.showOpenDialog(primaryStage); 
      if (file != null) { 
       open(file.toURI().toString()); 
      } 
     }); 

     VBox root = new VBox(5, 
       new HBox(new Label("URL:"), textField, openURLButton), 
       new HBox(openFileButton) 
     ); 

     root.setPadding(new Insets(20)); 
     primaryStage.setScene(new Scene(root)); 
     primaryStage.show(); 
    } 

    private void open(String resource) { 
     getHostServices().showDocument(resource); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 
+0

さて、私はそれを得ました。 'HostServices.showDocument(...)'メソッドは、ブラウザーだけを開くことができるだけでなく、オペレーティングシステムがインストールされているデフォルトのアプリケーションであらゆる種類のファイルを開くことができます。ありがとうたくさん:) –

+0

AWTには、システムエクスプローラでディレクトリを開く方法がありました。 JavaFXでは、システムエクスプローラでディレクトリを開く方法は? –

+0

@RanaDepto同じことが動作しますか? 'file'がディレクトリを参照する場合、' getHostServices()。showDocument(file.toURI()。toString()) 'は、システムファイルブラウザのディレクトリを開きます。 –

4

は、一般的に言えば、あなたはネイティブ次のようにファイルを開くためにDesktop#open(file)を使用することができます。

final Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; 
if (desktop != null && desktop.isSupported(Desktop.Action.OPEN)) { 
    desktop.open(file); 
} else { 
    throw new UnsupportedOperationException("Open action not supported"); 
} 

は、ファイルを開くために関連付けられたアプリケーションを起動します。指定された ファイルがディレクトリの場合、現在のプラットフォームのファイルマネージャは、それを開くために起動された です。

は具体的には、ブラウザの場合、あなたは次のように、直接Desktop#browse(uri)を使用することができます。

final Desktop desktop = Desktop.isDesktopSupported() ? Desktop.getDesktop() : null; 
if (desktop != null && desktop.isSupported(Desktop.Action.BROWSE)) { 
    desktop.browse(uri); 
} else { 
    throw new UnsupportedOperationException("Browse action not supported"); 
} 

URIを表示するには、デフォルトのブラウザを起動します。デフォルトのブラウザ が指定されたURIを処理できない場合、指定されたタイプのURIsを処理するために登録されたアプリケーション が呼び出されます。アプリケーションは、 URIクラスによって定義されるように、URIのプロトコルおよびパスから決定される である。呼び出し元スレッドに必要な 権限がなく、アプレット内から呼び出された場合は、 AppletContext.showDocument()が使用されます。同様に、呼び出しに に必要な権限がなく、これが Java Web Startedアプリケーション内から呼び出された場合は、BasicService.showDocument()が使用されます。ブラウザでhttp:スキームを持つURLを開くか、そのファイルタイプのデフォルトのアプリケーションを使用してファイルを開くには、いずれかの場合

+1

ありがとうございました。この答えは私のすべての要件を完全に満たしています:) –

0

java.awt.Desktopとの唯一の解決策は、JavaFXのからファイルを開くために私のために働きました。

しかし、最初は私のアプリケーションが停止し、新しいスレッドからDesktop#open(File file)を呼び出す必要があることを理解しなければなりませんでした。現在のスレッドまたはJavaFXアプリケーションスレッドPlatform#runLater(Runnable runnable)からメソッドを呼び出すと、例外がスローされることなくアプリケーションが無期限にハングする結果になりました。

これは、作業ファイルのオープンソリューションと小さなサンプルJavaFXアプリケーションは、次のとおりです。

import java.awt.Desktop; 
import java.io.File; 
import java.io.IOException; 

import javafx.application.Application; 
import javafx.concurrent.Task; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.stage.FileChooser; 
import javafx.stage.Stage; 

public class FileOpenDemo extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     final Button button = new Button("Open file"); 

     button.setOnAction(event -> { 
      final FileChooser fileChooser = new FileChooser(); 
      final File file = fileChooser.showOpenDialog(primaryStage.getOwner()); 

      if (file == null) 
       return; 

      System.out.println("File selected: " + file.getName()); 

      if (!Desktop.isDesktopSupported()) { 
       System.out.println("Desktop not supported"); 
       return; 
      } 

      if (!Desktop.getDesktop().isSupported(Desktop.Action.OPEN)) { 
       System.out.println("File opening not supported"); 
       return; 
      } 

      final Task<Void> task = new Task<Void>() { 
       @Override 
       public Void call() throws Exception { 
        try { 
         Desktop.getDesktop().open(file); 
        } catch (IOException e) { 
         System.err.println(e.toString()); 
        } 
        return null; 
       } 
      }; 

      final Thread thread = new Thread(task); 
      thread.setDaemon(true); 
      thread.start(); 
     }); 

     primaryStage.setScene(new Scene(button)); 
     primaryStage.show(); 
    } 

    public static void main(String[] args) { 
     launch(args); 
    } 
} 

javafx.application.HostServicesと他の提案された解決策は全く動作しませんでした。私はUbuntuの17.10 AMD64上OpenJFX 8u141を使用していますし、HostServices#showDocument(String uri)を呼び出すときに、私は次の例外を得た:明らかに

java.lang.ClassNotFoundException: com.sun.deploy.uitoolkit.impl.fx.HostServicesFactory

は、JavaFXのHostServicesはまだ正常にすべてのプラットフォームで実装されていません。このトピックについては、 https://github.com/Qabel/qabel-desktop/issues/420

関連する問題