2012-04-01 2 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

Смежные вопросы