2016-09-14 3 views
2

GUI를 지원하는 환경과 GUI를 지원하지 않는 환경에서 모두 Linux에서 실행할 JavaFx 응용 프로그램을 개발 중입니다. 의미, 응용 프로그램이 시작될 때 "ssh -X"로 실행되는 시스템에 GUI가 열려야하고, "ssh"(-X없이)로 연결하면 콘솔 버전의 응용 프로그램이 시작되어야합니다.JavaFX2 - GUI없이 응용 프로그램을 시작하기위한 옵션

JavaFx를 사용할 때 어떻게 이것을 할 수 있습니까?

나는 다음과 같은 방법으로 그것을 시도 :

public class Main extends Application { 

    @Override 
    public void start(Stage primaryStage) throws Exception { 

     FXMLLoader loader = new FXMLLoader(getClass().getClassLoader().getResource("MainGui.fxml")); 
     SplitPane page = null; 
     try { 
      page = (SplitPane) loader.load(); 
     } catch (IOException e) { 
      System.exit(1); 
     } 

     Scene scene = new Scene(page); 
     primaryStage.setScene(scene); 
     primaryStage.setResizable(false); 

     primaryStage.show(); 

    } 

    public static void main(String[] args) { 

     if (args.length == 1 && args[0].equals("nogui")) { 
      System.out.println("NOGUI SELECTED"); 
     } else { 
      launch(args); 
     } 
    } 
} 

그러나 그것은 작동하지 않았다, 나는 -X 옵션을 사용하지 않고 다른 컴퓨터에 SSH를 통해 연결을 시도 할 때, 난 여전히 오류가 나타납니다

Exception in thread "main" java.lang.reflect.InvocationTargetException 
     at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) 
     at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) 
     at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) 
     at java.lang.reflect.Method.invoke(Method.java:498) 
     at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
Caused by: java.lang.UnsupportedOperationException: Unable to open DISPLAY 
     at com.sun.glass.ui.gtk.GtkApplication.<init>(GtkApplication.java:68) 
     at com.sun.glass.ui.gtk.GtkPlatformFactory.createApplication(GtkPlatformFactory.java:41) 
     at com.sun.glass.ui.Application.run(Application.java:146) 
     at com.sun.javafx.tk.quantum.QuantumToolkit.startup(QuantumToolkit.java:257) 
     at com.sun.javafx.application.PlatformImpl.startup(PlatformImpl.java:211) 
     at com.sun.javafx.application.LauncherImpl.startToolkit(LauncherImpl.java:675) 
     at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:337) 
     at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328) 
     ... 5 more 

또한 "nogui"명령 줄 옵션을 제공하는 GUI 환경에서 응용 프로그램을 실행하면 "NOGUI SELECTED"라는 인쇄물을 받게되지만 응용 프로그램이 실행을 끝내지 않을 것입니다.

내가이 문제를 어떻게 해결할 수 있습니까?

+0

어떻게 JAR 파일을 만들었습니까? 내부의'Manifest.MF' 파일에는 무엇이 있습니까? 'main' 메소드를 호출하지 않고 JavaFX'Application' 클래스를 시작하도록 구성 할 수 있습니다. 편집 : 실제로 JavaFX Packager를 사용하는 경우에만 적용 할 수 있습니다. 확실하지 않습니다. – Itai

+0

Manifest.MF에서 볼 수있는 main 메소드의 경로가 있습니다. – Xyster

+0

그리고 어떻게 응용 프로그램을 실행합니까? – Itai

답변

3

내가 겪고있는이 문제의 원인을 정확히 모르겠습니다. 그러나 JavaFX는 스레드 문제가있는 것으로 알려져 있으며 JavaFX Main Class 생성 하위 스레드와 관련 될 수 있습니다. 그러나 나는 그것에 대해 충분히 지식이 없다.

하지만 내가 무엇 수 있습니다 할 수 있습니다, 하나를 찾고 있다면, 대안을 제공합니다. 별도의 클래스 (Application 클래스를 확장하지 않음)를 main 메소드로 생성 한 다음 Main 클래스를 호출하여 필요한 경우이 방법으로 nogui이 전달되면 애플리케이션이 종료됩니다. 당신이 인수를 전달하지 않으려면

public class NewMain { 
    public static void main(String[] args) throws Exception { 
     if (args.length == 1 && args[0].equals("nogui")) { 
      System.out.println("NOGUI SELECTED"); 
     } else { 
      Main.launch(Main.class, args); 
     } 
    } 
} 

, 당신은 단순히 Main.launch(Main.class) 대신 Main.launch(Main.class, args) 사용할 수 있습니다. 나는 이것을 시험하지 않았지만 효과가있다.

+0

감사합니다. – Xyster

0

우분투에서 javafx로 저에게 도움이되는 다른 곳의 답을 인용하면 ... 어쩌면 다른 사람에게 도움이 될 수 있습니다. 나는 정상적인 사용자에 대해서 당신과 같은 질문을했지만. 사용자 계정 foo를 사용하여 firefox를 시작하려고한다고 가정 해 봅시다. 나는 바로 로그인 해요 : 질문과 동일한 오류로 인해 실패] 명령

[[email protected] ~]$ sudo -u foo -H firefox

슬프게도 (즉, 어떤 프로토콜이 지정되지 & 열 수 없습니다 디스플레이)

내 솔루션은 단순히을 추가했다 사용자 foo를 X 서버에 대한 권한이 부여 된 액세스 목록에 추가하십시오.

xhost si:localuser:foo

그리고 그것을했다, 나는 다음 sudo는 사용자의 foo는을 사용하여 파이어 폭스 (그리고 다른 X 응용 프로그램)를 시작 할 수 있었다.

관련 문제