2016-06-16 11 views
1

Ich beginne eine JavaFX-Ansicht von meiner Hauptklasse, und ich möchte einen Wert an diese Instanz der Ansicht übergeben. Momentan verwende ich eine statische Member-Variable in der View-Klasse, möchte aber möglichst keine Statiken vermeiden.JavaFX übergeben Wert in Instanz der Ansicht, ohne statische Setzer

Hauptklasse

import javafx.application.Application; 

public class Main 
{ 
    public static void main(String[] args) 
    { 
     int value = 3; 
     View.setValue(value); 
     Application.launch(new View().getClass()); 
    } 
} 

Ansicht Klasse

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

public class View extends Application 
{ 

    private static int value; 

    @Override 
    public void start(Stage arg0) throws Exception 
    { 
     // TODO Auto-generated method stub 

    } 

    public static int getValue() 
    { 
     return value; 
    } 

    public static void setValue(int valueIn) 
    { 
     View.value = valueIn; 
    } 
} 

Gibt es einen besseren Weg, dies zu tun, dass die Variablen oder die Schaffung eines Start() -Methode bei der Verwendung statisches Element vermeidet Ansichtsklasse mit einem Parameter für Wert?

Vielen Dank im Voraus.

EDIT: Nur um zu klären, wie ich aus dem ursprünglichen Beitrag weggelassen (meine schlechte ich weiß), der tatsächliche "Wert" ich will in Passieren ist eine Instanz eines MBassador Event Bus (dh MBassador Bus), sonst alle Ihre Antworten perfekt funktioniert hätten

+1

Sie können nicht: Sie können keinen Verweis auf die Instanz der Unterklasse 'Application' abrufen, die von der Startmethode erstellt wurde, außer von dieser Instanz aus. Was du versuchst zu tun, macht wirklich keinen Sinn: In einer JavaFX - Anwendung solltest du die 'start()' Methode - ** nicht ** die 'main()' Methode - als Einstiegspunkt für die Anwendung. (Eine JavaFX-Anwendung benötigt nicht einmal eine 'main()' -Methode.) –

Antwort

1

Ja ein besserer Weg ist Ihren Wert als Argument Ihres Programms zu schaffen, dann ist es von Anfang Methode als nächster erhalten: wäre

public class View extends Application { 

    private int value; 

    public void start(Stage stage) { 
     List<String> unnamedParams = getParameters().getUnnamed(); 
     if (unnamedParams.size() > 0) { 
      this.value = Integer.parseInt(unnamedParams.get(0)); 
     } else { 
      throw new IllegalStateException("No argument has been provided"); 
     } 
    } 

dann Ihre Main Klasse:

public class Main 
{ 
    public static void main(String[] args) 
    { 
     Application.launch(new View().getClass(), args); 
    } 
} 

starten Schließlich Ihr Programm mit dem Argument als nächstes:

java Main 2 

Wenn Sie es als Parameter zu Ihrem Java-Programm nicht zur Verfügung stellen möchten es dann Application.launch(new View().getClass(), "2");

mit int Haupt Methode setzen

Was Sie erreichen möchten, kann nicht richtig ausgeführt werden, da wir keine Möglichkeit haben, in die Erstellung von Application von JavaFX einzugreifen , die einzigen Dinge, die wir zur Verfügung stellen können, sind String-Argumente, wie oben erklärt.

Ihr Ansatz ist eine gute Abhilfe, aber wenn Sie benötigen nur eine einzige Anwendung zu starten, wenn Sie nicht auch ein ThreadLocal verwenden könnten Ihr Objekt vorübergehend zu speichern, bis Sie es von der init Methode erhalten, da es die einzige Methode, mit der angerufene ist Aufrufthread.

public class Main 
{ 
    private static final ThreadLocal<MBassador> THREAD_LOCAL = new ThreadLocal<>(); 
    public static void main(String[] args) 
    { 
     THREAD_LOCAL.set(myObject) 
     try { 
      Application.launch(new View().getClass(), args); 
     } finally { 
      THREAD_LOCAL.remove(); 
     } 
    } 

    public static MBassador getMBassador() { 
     return THREAD_LOCAL.get(); 
    } 
} 

Dann können Sie es aus Ihrer Anwendung in der init-Methode als nächstes erhalten:

@Override 
public void init() throws Exception { 
    MBassador obj = Main.getMBassador(); 
    ... 
} 
+0

Wie empfehlen Sie dies, wenn ich ein Argument übergeben möchte, das nicht gut aus einer Zeichenkette geparst wird? Ich denke an etwas wie MBassager , dem leider keine nette .parseX() -Methode zugeordnet ist. –

+0

Ich kenne Ihre Klasse nicht, vielleicht könnten Sie sie als String im JSON-Format bereitstellen? oder geben Sie nur die Argumente an, um die Instanz dieses Objekts zu erstellen –

+0

Wie in meinem Kommentar unter der Frage ist der Weg dies zu tun, die Initialisierung direkt in die 'start()' Methode zu verschieben. Initialisiere die Dinge nicht in 'main()'. –

2

Von Handbuch:

https://docs.oracle.com/javase/8/javafx/api/javafx/application/Application.html

Typische Anwendungen sind:

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

Sie sollten die Anwendung nicht selbst erstellen. Application.launch erstellt das Objekt der angegebenen Klasse und startet es dann. Sie können die Argumente einfach an args übergeben und dann in Ihrer Anwendungsklasse mit getParameters() darauf zugreifen.

Verwandte Themen