2012-04-01 9 views
1

Ich möchte eine benutzerdefinierte Aktion in meiner neuen Komponente hinzufügen. Wie geht das?JavaFX 2.0 - Aktionshandler für benutzerdefinierte Komponente in FXML erstellen

Beispielcode:

Komponente

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? :-( */ 
      } 
     }); 
    } 
} 

-Controller

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 für die Hilfe

Antwort

6

Sie müssen die Eigenschaft in Ihrer benutzerdefinierten Komponente implementieren, die Ihre action speichert.

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

    }  
} 

und vergessen Sie nicht, Import in Ihrer fxml Datei hinzufügen:

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

Es funktioniert! Vielen Dank! :-) – fxuser