2010-06-08 16 views
0

Il m'a fallu du temps pour réaliser ce qui se passait avec les événements de souris passant par mes boîtes de dialogue de blocage lorsque je les fermais, mais j'ai finalement compris pourquoi. Je ne connais toujours aucun moyen de le réparer.JavaFX MouseEvent continue lorsque je supprime l'objet sur lequel il s'est produit

J'ai une boîte de dialogue personnalisée (qui bloque la souris) avec un bouton de fermeture. Lorsque je clique sur le bouton de fermeture, je supprime la boîte de dialogue de la scène, mais JavaFx traite toujours le MouseEvent et maintenant il trouve qu'il n'y a rien qui bloque l'écran derrière le bouton d'annulation, de sorte que le composant reçoit un MouseEvent. Comment faire pour que mouseEvent arrête le traitement quand je vois qu'ils ont appuyé sur annuler et supprimer la boîte de dialogue? Ou, y a-t-il un moyen de faire en sorte que la suppression de la boîte de dialogue ne se produise qu'après le traitement de MouseEvent?

Exemple de code pour le problème:

import javafx.stage.Stage; 
import javafx.scene.Scene; 
import javafx.scene.shape.Rectangle; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.control.Button; 

var theScene:Scene; 
var btn:Button; 

Stage { 
    title: "Application title" 
    scene: theScene= Scene { 
     width: 500 
     height: 200 
     content: [ 
     Rectangle{ 
      width: bind theScene.width 
      height: bind theScene.height 
      onMouseClicked: function(e:MouseEvent):Void{ 
           println("Rectangle");} 
     }, 
     Button{ 
      layoutX: 20 layoutY: 50 
      blocksMouse: true 
      text: "JustPrint" 
      action:function():Void{ 
        println("JustPrint");} 
     }, 
     btn = Button{ 
      layoutX: 20 layoutY: 20 
      blocksMouse: true 
      text: "Cancel" 
      action:function():Void{ 
        println("Cancel"); 
        delete btn from theScene.content;} 
     }, 
     ] 
    } 
} 

Lorsque vous appuyez sur "JustPrint" vous obtenez:

JustPrint 

Lorsque vous appuyez sur "Annuler" vous obtenez:

Cancel 
    Rectangle 

Répondre

0

Do vous avez vraiment besoin de gérer onMouseClicked sur le rectangle? Si vous le changez en onMousePressed, votre problème est parti.

Apparemment, le bouton a besoin de la séquence complète de la souris et de la souris pour effectuer l'action mais la suppression (ou le masquage) a lieu avant que le second soit intercepté. Et il semble qu'un événement de lancement de souris est suffisant pour déclencher l'événement onMouseClicked. Donc, si votre rectangle est heureux avec un onMousePressed simple, vous avez une solution de contournement ...

+0

Je l'ai besoin du onMouseClicked pour l'arrière-plan dans mon programme original (ou au moins onMouseReleased qui donne le même problème), mais il semble que je peux supprimer l'action du bouton et faire répondre à onMouseClicked à la place et le problème est résolu. Merci pour votre aide. Kyle – Kyle

0

Je pense que ce que vous voyez est un problème de synchronisation. Le bouton d'annulation est supprimé avant que l'événement ne soit totalement géré, l'événement est alors transmis au Rect, car la "blocksmouse" sur le bouton Annuler a été supprimée. Essayez ceci:

 action:function():Void{ 
      println("Cancel"); 
      FX.deferAction(function() { 
      delete btn from theScene.content; 
      }); 
    }