2017-08-28 83 views
1

我試圖從封閉的類啓動一個內部的應用程序類,這不起作用。JavaFX推出內部應用程序類

我已經嘗試從Window中刪除靜態修飾符並從Main的實例啓動它。

代碼:

import javafx.application.Application; 
import javafx.stage.Stage; 

public class Main { 
    private static class Window extends Application { 
     @Override 
     public void start(Stage stage) { 
      stage.show(); 
     } 
    } 

    public static void main(String args[]) { 
     Application.launch(Window.class, args); 
    } 
} 

例外:

Exception in Application constructor 
Exception in thread "main" java.lang.RuntimeException: Unable to construct Application instance: class VirtualLaunchpad$Window 
    at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:907) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication$1(LauncherImpl.java:182) 
    at java.lang.Thread.run(Thread.java:748) 
Caused by: java.lang.NoSuchMethodException: VirtualLaunchpad$Window.<init>() 
    at java.lang.Class.getConstructor0(Class.java:3082) 
    at java.lang.Class.getConstructor(Class.java:1825) 
    at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$7(LauncherImpl.java:818) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(PlatformImpl.java:294) 
    at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95) 
    at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method) 
    at com.sun.glass.ui.gtk.GtkApplication.lambda$null$5(GtkApplication.java:139) 
    ... 1 more 

回答

4

Application子類(和它的無參數的構造函數)必須是公共的。 Application.launch()方法在通過反射實例化應用程序類時僅搜索公共無參數構造函數。

import javafx.application.Application; 
import javafx.stage.Stage; 

public class Main { 
    public static class Window extends Application { 
     @Override 
     public void start(Stage stage) { 
      stage.show(); 
     } 
    } 

    public static void main(String args[]) { 
     Application.launch(Window.class, args); 
    } 
} 
+0

你說得對! :D我絕對確定我嘗試過!謝謝。你知道,如果你能以某種方式從Application.launch方法獲取Window實例,或者如果你必須讓Window實例告訴剛剛啓動的Main類? – Kangalioo

+0

@Kangalioo除了通過引用'start()'(或'init()')方法中的'this',你不能得到'launch()'創建的'Application'類的實例。 –

+0

在我的情況下,類和構造函數是公開的,但我錯過了「靜態」的關鍵工作,因此它不是開始。 – Line