2014-12-26 13 views
7

Come posso ottenere l'istanza dell'applicazione quando si utilizza javafx?Ottenere l'istanza dell'applicazione in javafx

Normalmente si avvia un'applicazione in questo modo:

public class LoginForm { 

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

} 

Il metodo di lancio non restituisce un'istanza di applicazione. C'è un modo per ottenere l'istanza?

+0

Hai fatto il google? http://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html – Dici

+0

@Dici Cosa intendi? – user2997204

+0

Tutto ciò di cui hai bisogno è nel documento. La tua classe principale ha solo bisogno di estendere 'Applicazione' e quindi il tuo metodo principale chiamerà semplicemente il metodo' launch'. In realtà, un metodo principale non è nemmeno necessario per eseguire un'applicazione JavaFX – Dici

risposta

-4

applicazione Di solito JavaFX utilizza scenebuilder per le viste JavaFX ed è associata a una classe controller che chiamerà sul accesso al file fxml:

public class Main extends Application { 

    @Override 
    public void start(Stage stage) throws Exception { 
     FXMLLoader myLoader = new FXMLLoader(getClass().getResource("/loginform.fxml")); 
     Parent root = myLoader.load(); 
     Scene scene = new Scene(root); 
     stage.setScene(scene); 
     stage.initStyle(StageStyle.DECORATED); 
     stage.show(); 
    } 

    public static void main(String[] args) { 
     Application.launch(args); 
    } 
} 
+5

Come risponde la domanda? – mario

3

Stavo solo cercando di trovare un modo logico semplice per fare esattamente questo . Non ho. Sarebbe davvero bello se ci fosse un Application.getApplicationFor (AppClass.class) che gestiva alcuni singleton per te - ma no.

Se limitiamo lo spazio del problema è piuttosto facile da risolvere. Se facciamo la classe di un Singleton, allora è torta ... Un pattern Singleton semplificato dovrebbe funzionare bene:

class MyApp extends Application 
{   
    public static MyApp me; 
    public MyApp() 
    { 
     me=this; 
    } 

    ... 
} 

me può essere nullo se non è stata creata un'istanza da parte del sistema ancora. Sarebbe possibile proteggersi da quello con più codice.

... attuazione del codice ...

appena implementato questo - sembra funzionare (salvo eventuali situazioni di threading strane) Ho una situazione leggermente diversa, sto incuneandosi uno schermo JavaFX in un altalena esistente GUI. Funziona bene, ma devo assicurarmi che Application.launch venga chiamato solo una volta. L'aggiunta di questo requisito, la mia soluzione finale è quindi:

(scusate ma la sintassi ha qualche groove in esso, dovrebbe essere facile per qualsiasi utente Java da tradurre)

class MyClass extends Application{ 
    private static MyClass instance 

    public MyClass() { 
     instance=this 
    } 

    public synchronized static getInstance() { 
     if(!instance) { 
      Thread.start { 
      // Have to run in a thread because launch doesn't return 
      Application.launch(MyClass.class) 
     } 
     while(!instance) 
      Thread.sleep(100) 
    } 
    return instance 
    ... 
} // class 

Questo gestisce il blocco fino Application.launch ha completato l'istanziazione della classe, ottenendo istanze da altre posizioni e assicurando che Application.launch venga chiamato esattamente una volta fintanto che getInstance è stato chiamato almeno una volta.

+0

Normalmente protesto contro l'uso di Singleton, ma a parte le circostanze estranee, per una semplice applicazione client, questo dovrebbe funzionare bene, almeno fino a quando non saranno richieste soluzioni più complicate. – Neil