2012-04-13 12 views
8

निम्न नमूना को ध्यान में रखते हुए।Javafx 2.0 कैसे-to Application.getParameters() एक Controller.java फ़ाइल में

नियंत्रक में एप्लिकेशन के तर्क/पैरामीटर तक कैसे पहुंचे?

धन्यवाद।


एनबी: मैं केवल एक कक्षा फ़ाइल में App.java और MyController.java मिश्रण करने की कोशिश की है, लेकिन मदद नहीं की।


App.java (सरलीकृत):

public class App extends Application { 

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

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

     // output arguments in console 
     System.out.println(getParameters().getNamed().toString()); 

     Parent root = FXMLLoader.load(getClass().getResource("MyView.fxml")); 
     final Scene scene = new javafx.scene.Scene(root); 
     primaryStage.setScene(scene); 
     primaryStage.show(); 
    } 

} 

MyController.java (सरलीकृत):

public class MyController implements Initializable { 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
     // HOW TO getParameters() HERE ? 
    } 

    @FXML 
    private Button myButton; 

    @FXML 
    private void my_Action(ActionEvent event) { 
     // HOW TO getParameters() HERE ? 
    } 

} 

MyView.fxml (सरलीकृत):

<AnchorPane fx:id="root" fx:controller="mainpackage.MyController"> 
    <children> 
     <Button fx:id="myButton" onAction="#my_Action" text="Start" /> 
    </children> 
</AnchorPane> 

उत्तर

13

1. सबसे सरल तरीका है - उन्हें अनुप्रयोग में सहेजें:

public class App extends Application { 

    public static void main(String[] args) { launch(); } 

    public static String parameters; 

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

    parameters = getParameters().getNamed().toString(); 

    Parent root = FXMLLoader.load(getClass().getResource("MyView.fxml")); 
    final Scene scene = new javafx.scene.Scene(root); 
    primaryStage.setScene(scene); 
    primaryStage.show(); 
    } 

} 

और उन्हें नियंत्रक में पढ़ें:

public class MyController implements Initializable { 

    @Override 
    public void initialize(URL url, ResourceBundle rb) { 
    System.out.println(App.parameters); 
    } 

2. अधिक जटिल है (लेकिन सामान्य रूप में बेहतर) दृष्टिकोण विषयों के बगल में वर्णित हैं:

+0

है यही कारण है कि मैं क्या किया था, लेकिन मैंने सोचा था कि एक और तरीका बन रही थीं। एक जो "सार्वजनिक स्थैतिक" से बच सकता है। वैसे भी ... धन्यवाद सर्गेई, यह दूसरी बार है जब आप मेरी मदद करते हैं। – ohFRY

0
public static <T extends Node, P> T load(String resource, final P parameter) 
      throws MoisException { 
     try { 
      logger.debug("resource: {}; parameter: {}", resource, parameter); 
      FXMLLoader loader = new FXMLLoader(getResource(resource)); 
      // pass parameter into Controller,before invoke the initialize() 
      loader.setControllerFactory(new Callback<Class<?>, Object>() { 
       @Override 
       public Object call(Class<?> param) { 
        Object controller = null; 
        try { 
         controller = ReflectUtil.newInstance(param); 
        } catch (InstantiationException e) { 
         throw new MoisException("can't new instance for: " + param.getName(), e); 
        } catch (IllegalAccessException e) { 
         throw new MoisException("can't new instance for: " + param.getName(), e); 
        } 
        if (controller instanceof ParameterAware) { 
         ((ParameterAware<P>) controller).setParameter(parameter); 
        } 
        return controller; 
       } 
      }); 
      T node = (T) loader.load(); 
      // pass parameter to node 
      node.setUserData(parameter); 
      return node; 
     } catch (IOException e) { 
      throw new MoisException("can't load the file: " + resource, e); 
     } 
    } 

और ParameterAware:

public interface ParameterAware<T> { 
    void setParameter(T param); 
} 
संबंधित मुद्दे