2017-09-28 14 views
1

私はすでに書いた "ヘルプファイル"を開くボタンを備えたJavaFXアプリケーションを持っています。ユーザーがボタンを押すとデフォルトのテキストエディタ内で開きたいと思っています。このファイルは、メインFXクラス、コントローラー、およびFXMLファイルを含むパッケージ内にあります。私はファイルを開くためにいくつかの異なることを試みたが、それらのどれも働いていない。ここに私は現在働いているように思える方法がありますが、そうではありません。私は間違って何をしていますか?明確にするために、すべてが内部にあるパッケージの名前は "nutritionfx"という名前であり、このコードはコントローラ内部のメソッドです。アプリケーションの実行中にパッケージからテキストファイルを開く方法は?

//method to open help file when help button is pressed 
@FXML private void handleHelpButton(ActionEvent event) throws IOException, URISyntaxException { 
    URL url = this.getClass().getResource("/nutritionfx/help.txt"); 
    File file = new File(url.toURI()); 
    Desktop.getDesktop().edit(file); 
} 
+2

リソースuriを 'File'にラップしてもファイルにはなりません。リソースファイルがjarの中にあり、エディタがファイルを期待している場合、ファイルにアクセスすることはできません。リソースとしてファイルにアクセスできるようにするために私が知っている唯一のアプローチは、リソースの内容をファイルにコピーすることです。 – fabian

+0

パッケージファイルから新しいファイルを作成し、そのファイルを開くのがベストでしょうか?それはユーザーのコンピュータに新しいファイルを作成しますか? – Trace

+1

はい、まさにそのトレースです。 – jewelsea

答えて

2

ここに、トレースを提案したソリューションを示すサンプルアプリケーションがあります。

開き、

サンプルアプリケーションは、アプリケーションとパッケージ化リソースからデータを読み込み、アプリケーションディレクトリ内のローカルファイルにそれを保存します、そのファイルをパッケージ化ファイルから新しいファイルを作成します( `.FileEditor 'という名前)をユーザのホームディレクトリ内に作成します。ユーザーは、テキストエディタでテキストを編集し、変更されたテキストをローカルファイルに保存することができます。次にアプリケーションを実行すると、パッケージ化されたリソースのテキストではなく、変更されたテキストが読み込まれ、使用されます。

import javafx.application.Application; 

import javafx.scene.Scene; 
import javafx.scene.control.*; 
import javafx.scene.layout.BorderPane; 
import javafx.stage.Stage; 

import java.io.IOException; 
import java.nio.file.Files; 
import java.nio.file.Path; 
import java.nio.file.Paths; 
import java.util.stream.Collectors; 

public class FileEditor extends Application { 

    private static final Path USER_FILE_PATH = Paths.get(
     System.getProperty("user.home"), 
     ".FileEditor" 
    ); 

    private static final String SOURCE_FILE_NAME = "xyzzy.txt"; 

    @Override 
    public void start(Stage stage) throws Exception { 
     if (!Files.isDirectory(USER_FILE_PATH)) { 
      Files.createDirectory(USER_FILE_PATH); 
     } 

     Path editableFilePath = Paths.get(USER_FILE_PATH.toString(), SOURCE_FILE_NAME); 
     if (!Files.exists(editableFilePath)) { 
      Files.copy(
       FileEditor.class.getResourceAsStream(SOURCE_FILE_NAME), 
       editableFilePath 
      ); 
     } 

     String text = Files.readAllLines(
       editableFilePath 
     ).stream() 
       .collect(Collectors.joining("\n")); 

     TextArea textArea = new TextArea(text); 

     MenuItem save = new MenuItem("Save..."); 
     save.setOnAction(event -> { 
      try { 
       Files.write(editableFilePath, textArea.getText().getBytes()); 
      } catch (IOException e) { 
       e.printStackTrace(); 
      } 
     }); 
     MenuItem exit = new MenuItem("Exit"); 
     exit.setOnAction(event -> stage.hide()); 
     MenuBar menuBar = new MenuBar(
       new Menu("File", null, save, exit) 
     ); 

     BorderPane layout = new BorderPane(); 
     layout.setTop(menuBar); 
     layout.setCenter(textArea); 

     Scene scene = new Scene(layout); 
     stage.setScene(scene); 
     stage.show(); 
    } 


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

サンプルソースリソースxyzzy.txt、FileEditor.javaコードと同じディレクトリに入れ、ビルドシステムによってリソース出力およびパッケージングディレクトリにコピー:

You are in a maze of twisty passages, all alike. 
xyzzy 
You are inside the building. 

foobar

このサンプルでは、​​JavaFXアプリケーション内でTextAreaを使用してファイルを編集しますが、デフォルトのシステムテキストエディタでは、構造を使用して簡単に開くことができます。

getHostServices().showDocument(
    editableFilePath.toUri().toURL().toExternalForm() 
); 
関連する問題