2017-08-28 7 views
1

Je tente de lancer une classe Application interne à partir de la classe englobante, ce qui ne fonctionne pas.JavaFX launch inner Classe d'application

J'ai déjà essayé de supprimer le modificateur statique de Windows et de le lancer depuis une instance de Main.

code:

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:

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 

Répondre

4

La Application sous-classe (et son constructeur sans arg) doit être public. La méthode Application.launch() recherche uniquement les constructeurs sans-argument publics lorsqu'il instancie la classe d'application par réflexion.

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

Vous avez raison! : D J'étais absolument sûr d'avoir essayé ça! Merci. Savez-vous si vous pouvez obtenir l'instance Window à partir de la méthode Application.launch ou si vous devez faire en sorte que l'instance de Windows indique la classe Main qui vient d'être lancée? – Kangalioo

+0

@Kangalioo Vous ne pouvez pas obtenir l'instance de la classe 'Application' qui est créée par' launch() ', sinon en faisant référence à' this' dans les méthodes 'start()' (ou 'init()') . –

+0

Dans mon cas, la classe et le constructeur étaient publics, mais il me manquait des claviers "statiques", donc ça ne commençait pas. – Line