JavaFX MouseEvent продолжается, когда я удаляю объект, на котором это произошло - PullRequest
0 голосов
/ 08 июня 2010

Мне потребовалось некоторое время, чтобы понять, что происходит с событиями мыши, проходящими через мои блокирующие диалоговые окна, когда я закрывал их, но я наконец понял, почему. Я до сих пор не знаю хорошего способа исправить это.

У меня есть настраиваемое диалоговое окно (которое блокирует мышь) с кнопкой закрытия. Когда я нажимаю кнопку закрытия, я удаляю диалоговое окно со сцены, но JavaFx все еще обрабатывает MouseEvent, и теперь он обнаруживает, что ничто не блокирует экран позади, где была кнопка отмены, так что компонент получает MouseEvent. Как заставить mouseEvent остановить обработку, когда я вижу, что они нажали кнопку отмены и удалили диалоговое окно? Или есть ли способ сделать так, чтобы удаление диалогового окна не происходило до тех пор, пока не будет завершена обработка MouseEvent?

Пример кода проблемы:

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;}
         },
      ]
   }
}

Когда вы нажимаете «JustPrint», вы получаете:

JustPrint

Когда вы нажимаете «Отмена», вы получаете:

  Cancel
  Rectangle

Ответы [ 2 ]

0 голосов
/ 24 июня 2010

Я думаю, что вы видите, это проблема времени.Кнопка отмены удаляется до полной обработки события, таким образом, событие затем передается в Rect, потому что «blockmouse» на кнопке Cancel был удален.Попробуйте вместо этого:

     action:function():Void{
          println("Cancel");
          FX.deferAction( function() {
            delete btn from theScene.content;
          });
     }
0 голосов
/ 10 июня 2010

Вам действительно нужно обработать onMouseClicked на прямоугольнике? Если вы измените его на onMousePressed, ваша проблема исчезнет.

Очевидно, что для выполнения действия необходимо, чтобы кнопка полностью нажала / отпустила последовательность мыши, но удаление (или скрытие) происходит до того, как перехвачена вторая. И кажется, что события освобождения мыши достаточно, чтобы вызвать событие onMouseClicked. Так что если ваш прямоугольник доволен простым onMousePressed, у вас есть обходной путь ...

...