2012-04-01 43 views
1

新しいコンポーネントにカスタムアクションを追加したいと思います。 これを行う方法は?JavaFX 2.0 - FXMLのカスタムコンポーネントのアクションハンドラを作成

例コード:

コンポーネント

public class MyCustomComponent extends Region { 
    public MyCustomComponent(){ 
     super(); 

     this.setOnMouseClicked(new EventHandler<MouseEvent>(){ 

      @Override 
      public void handle(MouseEvent event) { 
       /* throw my custom event here and handle it in my FXML controller - but how? :-( */ 
      } 
     }); 
    } 
} 

コントローラ

public class MyController { 
    @FXML protected void myCustomAction(ActionEvent event) { 
     // do something 
    } 
} 

FXML:ヘルプ

ため

<BorderPane fx:controller="fxmlexample.MyController" 
    xmlns:fx="http://javafx.com/fxml"> 
    <top> 
     <MyCustomComponent onAction="#myCustomAction"> 
     </MyCustomComponent> 
    </top> 
</BorderPane> 

Thxを

答えて

6

actionを保存するカスタムコンポーネントにプロパティを実装する必要があります。

public class MyCustomComponent extends Region { 
    public MyCustomComponent(){ 
     super(); 

     // just to find out where to click 
     setStyle("-fx-border-color:red;"); 
     setPrefSize(100, 100); 

     this.setOnMouseClicked(new EventHandler<MouseEvent>(){ 

      @Override 
      public void handle(MouseEvent event) { 
       onActionProperty().get().handle(event); 
      } 
     }); 
    } 

    // notice we use MouseEvent here only because you call from onMouseEvent, you can substitute any type you need 
    private ObjectProperty<EventHandler<MouseEvent>> propertyOnAction = new SimpleObjectProperty<EventHandler<MouseEvent>>(); 

    public final ObjectProperty<EventHandler<MouseEvent>> onActionProperty() { 
     return propertyOnAction; 
    } 

    public final void setOnAction(EventHandler<MouseEvent> handler) { 
     propertyOnAction.set(handler); 
    } 

    public final EventHandler<MouseEvent> getOnAction() { 
     return propertyOnAction.get(); 

    }  
} 

とあなたのFXMLファイルにインポートを追加することを忘れないでください:それは作品

<?import my.package.MyCustomComponent?> 
+0

!ありがとう! :-) – fxuser

関連する問題