2017-09-28 23 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를 넣어도 파일이 아닙니다. 리소스 파일이 jar 파일 안에 있고 편집기가 파일을 예상하면 파일에 대한 액세스 권한을 얻지 못합니다. 리소스로 파일에 액세스 할 수 있도록하는 유일한 방법은 리소스의 내용을 파일로 복사하는 것입니다. – fabian

+0

그러면 패키지 파일에서 새 파일을 만든 다음 해당 파일을 열려면 가장 좋을까요? 그러면 사용자 컴퓨터에 새 파일이 생성됩니까? – Trace

+1

예, 정확히 추적합니다. – jewelsea

답변

2

다음은 Trace를 제안한 솔루션을 보여주는 예입니다.

엽니,

샘플 응용 프로그램은 응용 프로그램과 함께 패키지 리소스에서 데이터를 읽고 응용 프로그램 디렉토리에 로컬 파일이 저장됩니다 해당 파일을 패키징 된 파일에서 새 파일을 생성 (`.FileEditor ')를 사용자의 홈 디렉토리에 저장한다. 사용자는 텍스트 편집기에서 텍스트를 편집하고 수정 된 텍스트를 로컬 파일에 저장할 수 있습니다. 다음에 응용 프로그램을 실행할 때 패키지 된 텍스트의 텍스트가 아닌 수정 된 텍스트를 읽고 사용합니다.

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

foobar

이를 : 빌드 시스템에 의해 자원 출력 및 포장 디렉토리에 FileEditor.java 코드와 동일한 디렉토리에 넣고 복사

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, 샘플은 JavaFX 응용 프로그램 내에서 TextArea를 사용하여 파일을 편집하지만 기본 시스템 텍스트 편집기에서 구성을 사용하여 쉽게 열 수 있습니다.

getHostServices().showDocument(
    editableFilePath.toUri().toURL().toExternalForm() 
);