13

特定のファイルのシステム優先エディターを開く方法を見つけようとしています。

たとえば、Java で書かれたファイル マネージャーがあるとします。ユーザーはフォルダに移動し、ファイルのリストを表示します。そして、たとえば、ファイルがありますIcon.jpg。ユーザーがファイル名をダブルクリックすると、ファイルがシステムの優先エディター (つまり Gimp) で開きます。主な問題は - どうやってそれを行うのですか?

できますRuntime.getRuntime().exec("something file")が、この方法で、ユーザー環境でどのプログラムが優先されるかを知る必要があります。しかし、どのように?

もできますDesktop.getDesktop().edit(File file)が、この方法ではプロセスを追跡できず、この子プロセスが閉じられていることを知ることができません。その他の問題 - Linux では機能しません (少なくとも Ubuntu 8.10 では)。もありますがDesktop.getDesktop().open(File file)、そのファイル タイプのシステム ビューアーではなく、強制的にファイル ビューアーを開きます。

私は一週間中解決策を探していますが、適切で一般的な解決策はありませんでした。この質問に対する他のアプローチを知っていますか? 私のプロジェクトでは、Windows + Linux + Mac で動作すれば十分です。

回答とアドバイスありがとうございます。

2009-02-08 23:04 に編集

その他の提案: Mac の「ファイルを開く」のように、Windows と Linux で「アプリケーション選択」ウィンドウを強制できますか? たとえば、ファイルを開こうとすると、システムが優先するアプリケーションのリストからアプリケーションを選択するように求められますか? (Windows エクスプローラーの "Open with..." のようなもの)。あなたは知っていますか?

4

5 に答える 5

7

java.awt.Desktopオブジェクトを確認してください。あなたの場合、呼び出したいedit()

特定のプラットフォームがこの呼び出しをサポートしていることを確認したい場合は、次のようなことができます (このコードはテストしていません)。

public boolean editFile(final File file) {
  if (!Desktop.isDesktopSupported()) {
    return false;
  }

  Desktop desktop = Desktop.getDesktop();
  if (!desktop.isSupported(Desktop.Action.EDIT)) {
    return false;
  }

  try {
    desktop.edit(file);
  } catch (IOException e) {
    // Log an error
    return false;
  }

  return true;
}
于 2009-02-08T17:28:11.160 に答える
2

これはクロスプラットフォームではありませんが、Mac OS X では実行できます

Runtime.getRuntime().exec("open filename");

open(1)実行可能ファイルは、LaunchServices を使用し実行する適切なプログラムを選択し、それを使用して という名前のファイルを開きますfilename

于 2009-02-08T17:27:12.270 に答える
0

JavaFX アプリケーションの場合、HostServices を使用できます。この質問では、HostServices の使用方法について説明します。これは Ubuntu (テスト済み)/Windows (未テスト) および Mac (未テスト) で動作するはずです。

import java.io.File;
import java.io.IOException;
public class App extends Application {
}

File file = new File("/your/file/path");
HostServices hostServices = getHostServices();
hostServices.showDocument(file.getAbsolutePath());

getHostServices() は JavaFX Application クラスのメソッドです。

于 2022-01-04T09:34:03.020 に答える