2012-04-13 34 views
8

Xem xét mẫu sau.Javafx 2.0 Hướng dẫn sử dụng.getParameters() trong tệp Controller.java

Cách truy cập vào đối số/tham số của ứng dụng trong bộ điều khiển?

Cảm ơn bạn.


NB: Tôi đã cố gắng kết hợp App.java và MyController.java chỉ trong một tệp Lớp nhưng không được trợ giúp.


App.java (giản thể):

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 (giản thể):

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 (giản thể):

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

Trả lời

13

1. Cách đơn giản nhất - lưu chúng trong ứng dụng:

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(); 
    } 

} 

và đọc chúng trong điều khiển:

public class MyController implements Initializable { 

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

2. More phức tạp (nhưng tốt hơn nói chung) các phương pháp tiếp cận được mô tả trong các chủ đề tiếp theo:

+0

Đó là những gì tôi đã làm, nhưng tôi nghĩ rằng có một cách khác. Một trong đó có thể tránh được "tĩnh công cộng". Dù sao ... Cảm ơn bạn Sergey, đây là lần thứ hai bạn giúp tôi. – 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); 
     } 
    } 

và ParameterAware:

public interface ParameterAware<T> { 
    void setParameter(T param); 
} 
Các vấn đề liên quan