2017-07-16 2 views
1

J'avais de très grandes méthodes de gestion d'événements dans ma classe de contrôleurs. J'ai placé chacun d'entre eux dans une classe séparée, mais maintenant ils ne sont plus appelés.Ajout d'un gestionnaire d'événements dans javafx via une classe personnalisée

Voici comment il est actuellement mis en œuvre:

private DragDetectedHandler dragDetectedHandler = new DragDetectedHandler(stacks, nextCards, gameTable);; 
node.setOnDragDetected(dragDetectedHandler); 

Si j'appelle cela fonctionne:

node.setOnDragDetected(System.out::println); 

(Juste pour vérifier que le code est atteint)

Et la classe gestionnaire :

public class DragDetectedHandler implements EventHandler<MouseEvent> { 
private Stacks stacks; 
private NextCards nextCards; 
private Table gameTable; 

public DragDetectedHandler(Stacks stacks, NextCards nextCards, Table gameTable) { 
    this.stacks = stacks; 
    this.nextCards = nextCards; 
    this.gameTable = gameTable; 
} 

@Override 
public void handle(MouseEvent mouseEvent) { 
    System.out.println("Handle stuff here :)"); 
} 
} 

Je suis probablement en train de négliger quelque chose mais des questions similaires ne m'ont pas aidé à obtenir ma réponse. Donc, la question: Comment appeler le gestionnaire d'événements? Ou pourquoi le code suivant n'appelle pas le gestionnaire d'événements?

node.setOnDragDetected(dragDetectedHandler); 
+0

Pouvez-vous s'il vous plaît modifier votre question d'inclure ... eh bien ... une question? –

+0

@JoeC Merci, j'ai oublié de poser la question – Vinagy

Répondre

1

J'ai essayé ce code et je l'ai trouvé efficace.

Pour essayer de trouver ce qui pourrait être faux, vous pouvez vérifier ce que vous importez et assurez-vous que javafx et non swing ou awt.

Voici ce que j'ai essayé:

package test; 

import javafx.event.EventHandler; 
import javafx.scene.input.MouseEvent; 

public class DragDetectedHandler implements EventHandler<MouseEvent> { 

private String test; 

public DragDetectedHandler(String test) { 
    this.test = test; 
} 

@Override 
public void handle(MouseEvent mouseEvent) { 
    System.out.println("Handle stuff here :)"); 
} 
} 

et l'autre classe:

package test; 

import javafx.application.Application; 
import javafx.scene.Scene; 
import javafx.scene.control.Button; 
import javafx.stage.Stage; 


public class Test2 extends Application{ 

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

@Override 
public void start(Stage stage) throws Exception { 
    DragDetectedHandler dragDetectedHandler = new 
     DragDetectedHandler("Test"); 
    Button button = new Button(); 
    button.setOnDragDetected(dragDetectedHandler); 
    Scene scene = new Scene(button); 
    stage.setScene(scene); 
    stage.show(); 
} 

} 
+0

Merci pour la réponse, apparemment je l'appelais avant que le constructeur a été appelé pour le gestionnaire d'événements. – Vinagy

1

le Node doit être activé pour que l'événement fonctionnera.

J'ai essayé ce code, il est un travail quand je fais glisser le rectangle:

public class Main extends Application 
{ 

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

    @Override 
    public void start(Stage stage) throws Exception 
    { 
     DragHandler dh = new DragHandler(); 
     StackPane pane = new StackPane(); 
     Rectangle rect = new Rectangle(200 , 200 , 200 ,200); 
     rect.setOnDragDetected(dh); 
     pane.getChildren().add(rect); 
     Scene scene = new Scene(pane , 600 , 600); 
     stage.setScene(scene); 
     stage.show(); 
    } 

    private class DragHandler implements EventHandler<MouseEvent> 
    { 
     @Override 
     public void handle(MouseEvent event) 
     { 
      System.out.println("OK"); 
     } 
    } 
} 
+0

Merci pour la réponse, apparemment je l'appelais avant que le constructeur a été appelé pour le gestionnaire d'événements. – Vinagy