2015-05-09 12 views
18

Sto sviluppando un'applicazione JavaFx in netbeans, in netbeans il progetto sta costruendo e sta funzionando bene.Alcune scene non si caricano dopo la creazione di Maven

Ho creato un build (pacchetto mvn) dal mio progetto senza errori, ma quando lancio il programma non carica tutte le scene e FXMLLoader restituisce con valore null in questo caso.

Tutti i file .fxml nella stessa cartella.

public class JavaFXApplication extends Application { 

    public static final String TOOLBAR_MAIN = "toolbarMain"; 
    public static final String TOOLBAR_MAIN_FXML = "/fxml/ToolbarMain.fxml"; 
    public static final String TOOLBAR_SUB = "toolbarSub"; 
    public static final String TOOLBAR_SUB_FXML = "/fxml/ToolbarSub.fxml"; 

    public static final String NEW_SESSION_PANEL = "newSession"; 
    public static final String NEW_SESSION_PANEL_FXML = "/fxml/NewSessionPanel.fxml"; 
    public static final String OPEN_SESSION_PANEL = "openSession"; 
    public static final String OPEN_SESSION_PANEL_FXML = "/fxml/OpenSessionPanel.fxml"; 
    public static final String CONNECTIONS_PANEL = "connections"; 
    public static final String CONNECTIONS_PANEL_FXML = "/fxml/ConnectionsPanel.fxml"; 
    public static final String LOGS_PANEL = "logs"; 
    public static final String LOGS_PANEL_FXML = "/fxml/LogsPanel.fxml"; 
    public static final String EXCEPTIONS_PANEL = "exceptions"; 
    public static final String EXCEPTIONS_PANEL_FXML = "/fxml/ExceptionsPanel.fxml"; 
    public static final String MESSAGES_PANEL = "messages"; 
    public static final String MESSAGES_PANEL_FXML = "/fxml/MessagesPanel.fxml"; 

    public static ScreensController menuContainer = new ScreensController(); 
    public static ScreensController contentContainer = new ScreensController(); 

    public static ServerService server = new ServerService(); 

    public static Stage STAGE; 

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

     STAGE = primaryStage; 

     primaryStage.setOnCloseRequest((WindowEvent t) -> { 
      if (server.isRunning()) { 
       server.cancel(); 
      } 
     }); 

     menuContainer.loadScreen(JavaFXApplication.TOOLBAR_MAIN, 
       JavaFXApplication.TOOLBAR_MAIN_FXML); 
     menuContainer.loadScreen(JavaFXApplication.TOOLBAR_SUB, 
       JavaFXApplication.TOOLBAR_SUB_FXML); 

     contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL, 
       JavaFXApplication.NEW_SESSION_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.OPEN_SESSION_PANEL, 
       JavaFXApplication.OPEN_SESSION_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.NEW_SESSION_PANEL, 
       JavaFXApplication.NEW_SESSION_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.CONNECTIONS_PANEL, 
       JavaFXApplication.CONNECTIONS_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.LOGS_PANEL, 
       JavaFXApplication.LOGS_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.EXCEPTIONS_PANEL, 
       JavaFXApplication.EXCEPTIONS_PANEL_FXML); 
     contentContainer.loadScreen(JavaFXApplication.MESSAGES_PANEL, 
       JavaFXApplication.MESSAGES_PANEL_FXML); 
     menuContainer.setScreen(JavaFXApplication.TOOLBAR_MAIN); 
     contentContainer.setScreen(JavaFXApplication.NEW_SESSION_PANEL); 

     SplitPane root = new SplitPane(); 

     root.getItems().addAll(menuContainer, contentContainer); 
     Scene scene = new Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
     primaryStage.setResizable(false); 
     primaryStage.setTitle("Exam Supervisor"); 

    } 

regolatore dello schermo in cui gli schermi caricati:

public class ScreensController extends StackPane { 

    private HashMap<String, Node> screens = new HashMap<>(); 

    public void addScreen(String name, Node screen) { 
     screens.put(name, screen); 
    } 

    public boolean loadScreen(String name, String resource) { 
     try { 
      FXMLLoader myLoader = new FXMLLoader(getClass().getResource(resource)); 
      System.out.println("name:" + name + " ,resource" + resource + " ,loader:" + myLoader.getLocation()); 
      Parent loadScreen = myLoader.load(); 
      ControlledScreen myScreenControler 
        = myLoader.getController(); 
      myScreenControler.setScreenParent(this); 
      addScreen(name, loadScreen); 
      return true; 
     } catch (Exception e) { 
      System.out.println("name: " + name + ", resource" + resource + " ,exception: " + e.getMessage()); 
      return false; 
     } 
    } 

    public boolean setScreen(final String name) { 

     if (screens.get(name) != null) { 
      final DoubleProperty opacity = opacityProperty(); 

      if (!getChildren().isEmpty()) { 
       getChildren().remove(0); 
       getChildren().add(0, screens.get(name)); 
      } else { 
       getChildren().add(screens.get(name)); 
      } 
      return true; 
     } else { 
      System.out.println(screens.get(name) + " ,screen hasn't been loaded!\n"); 
      return false; 
     } 

    } 

    public boolean unloadScreen(String name) { 
     if (screens.remove(name) == null) { 
      System.out.println("Screen didn't exist"); 
      return false; 
     } else { 
      return true; 
     } 
    } 
} 

mio github repo: https://github.com/eszikk/ExamSuperVisorServer

+0

Hai la fxml come sottocartella di risorse: avete la stessa struttura nel file jar che viene creato? –

+0

Sì. La build creata/target/classes/struttura fxml e contiene tutti i file .fxml. –

+0

Non era quello che chiedevo. Nel file jar * generato *, la cartella fxml è di livello superiore o è stata collocata in una cartella delle risorse? –

risposta

1

Provare a usare javafx-maven-plugin Speranza, può aiutare.

+0

in genere quando qualcuno mette una taglia sulla loro domanda, in genere cercano più dettagli di un semplice link. Spiega all'OP perché il tuo suggerimento ti aiuterà e in che modo e come implementarlo. Così com'è, questa è una povera risposta. – nomistic

+0

Siamo spiacenti, sono nuovo). Ho avuto un problema simile, prima di iniziare a fare i bagagli con questo plugin, forse può aiutare in questo caso. È solo un suggerimento. – mremne21

4

Ho esaminato i file di progetto netbeans e il maven pom e non ho trovato nulla di strano. Il fatto che le librerie javafx non siano contenute nel classpath di entrambe le configurazioni mi dice che lo stai usando dall'installazione di Java.

Forse si utilizza un'installazione differrent Java da netbeans e quando si avvia il target maven. Quindi, il modulo fxml potrebbe mancare o non è installato java fx con la seconda installazione o qualcos'altro non è compatibile.

Hai avviato il target di esperti da una console? per esempio.

java-jar xyz.jar

Prova

java -version

e confrontare la versione con la versione di Java utilizzata da NetBeans (guida> Informazioni su) .

La creazione di NetBeans viene eseguita da una versione interna di Maven. Ma c'è anche la possibilità che una build esterna di maven usi una versione diversa del compilatore java rispetto alla build interna di netbeans.

Spero che questo aiuti!

0

Ho eseguito correttamente l'applicazione dall'esterno di Netbeans dopo aver apportato le seguenti modifiche.

In primo luogo, mi chiedevo perché hai il plugin del compilatore. Così, ho rimosso e stava ottenendo errore "file di classe per sun.util.logging.PlatformLogger non trovato" durante la compilazione.

siete venuti in questione come spiegato nel JavaFX8 - sun.util.logging.PlatformLogger not found Exception in NetBeans 8

È necessario per risolvere il problema.

In secondo luogo, quello che avevi era solo la fase di compilazione, non un barattolo percorribile.

Potrebbe esserci un modo per farlo usando il plugin del compilatore (o avendo altri jar dipendenti nel classpath), ma ho trovato più facile usare il plugin assembly per creare un jar con tutte le dipendenze ..

Aggiungere il seguente al vostro pom.xml

  <plugin> 
      <artifactId>maven-assembly-plugin</artifactId> 
      <configuration> 
       <archive> 
        <manifest> 
         <mainClass>com.eszik.supervisorserver.main.Main</mainClass> 
        </manifest> 
       </archive> 
       <descriptorRefs> 
        <descriptorRef>jar-with-dependencies</descriptorRef> 
       </descriptorRefs> 
      </configuration> 
     </plugin> 

successivo, eseguire i comandi di due mvn separatamente.

mvn clean install 
mvn assembly:single 

E poi, java -jar bersaglio/SuperVisorServer-1.0-SNAPSHOT-jar-con-dependencies.jar

Problemi correlati