2016-10-21 2 views
1

Здравствуйте, я пытаюсь запустить событие каждые 10 миллисекунд при условиях обнаружения перетаскивания, но мышь не была выпущена. Ниже приведен код, который я хочу запустить.Увольнение события каждые 10 миллисекунд при определенном условии Javafx

mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { 
     endX = e.getX(); 
     endY = e.getY(); 
     Bounds viewBounds = mapScroll.getViewportBounds(); 
     double startEndX = startX - endX; 
     double startEndY = startY - endY; 

     Bounds contentBounds = mapScroll.getContent().getLayoutBounds(); 

     double hChange = startEndX/(contentBounds.getWidth() - viewBounds.getWidth()); 
     double vChange = startEndY/(contentBounds.getHeight() - viewBounds.getHeight()); 
     mapScroll.setHvalue(mapScroll.getHvalue() + hChange); 
     mapScroll.setVvalue(mapScroll.getVvalue() + vChange); 

     startX = endX; 
     startY = endY; 
    }); 

К сожалению, до того, как я попытался использовать запланированную службу исполнителя в рамках мероприятия, но это не сработало правильно.

+0

Я не уверен, что этот вопрос имеет смысл. Фильтр событий, который у вас уже есть, будет выполняться один раз за импульс, если мышь перетаскивается и меняет местоположение во время этого импульса, то есть будет выполняться так быстро, как система может обнаруживать изменения в местоположении мыши и отвечать на них. Каждые 10 мс (100 Гц) немного быстрее целевой частоты пульса для JavaFX (это 60 Гц), поэтому не все изменения, которые вы делаете на панели прокрутки, будут отображаться в любом случае (иногда два изменения происходят в одном и том же импульсе). Что ты пытаешься сделать? –

+0

@James_D Я думаю, что он пытается что-то сделать, например, когда вы перетаскиваете файл или папку в проводнике Windows и имеет множество файлов по вертикали или по горизонтали, полоса прокрутки перемещается вертикально или горизонтально в зависимости от положения мыши (если мышь достигла конца окна по вертикали или по горизонтали), чтобы вы могли видеть и другие файлы. – GOXR3PLUS

+0

Теоретически он должен быстро это обновить, но на практике он перемещается в заметных прыжках, что не то, что я хочу. Я знаю, что это не мой компьютер, так как программа мало влияет на процент моего процессора, который я использую, или на мою RAM. Я сомневаюсь, что это проблема с моим кодом, поскольку такая же проблема присутствовала в 'set Pannable (true);' так что ... сложный материал заставляет его работать не так хорошо. –

ответ

1

Просто добавьте чек, если 10ms, прошедшее с момента последнего выполнения. (Я использовал LongProperty, из-за final restriction с Лямбдами)

final LongProperty timeOfLastExecute = new SimpleLongProperty(System.currentTimeMillis()); 

mapScroll.addEventFilter(MouseEvent.MOUSE_DRAGGED, e -> { 
     if(System.currentTimeMillis() - timeOfLastExecute.get() > 10) { 
      endX = e.getX(); 
      endY = e.getY(); 
      Bounds viewBounds = mapScroll.getViewportBounds(); 
      double startEndX = startX - endX; 
      double startEndY = startY - endY; 

      Bounds contentBounds = mapScroll.getContent().getLayoutBounds(); 

      double hChange = startEndX/(contentBounds.getWidth() - viewBounds.getWidth()); 
      double vChange = startEndY/(contentBounds.getHeight() - viewBounds.getHeight()); 
      mapScroll.setHvalue(mapScroll.getHvalue() + hChange); 
      mapScroll.setVvalue(mapScroll.getVvalue() + vChange); 

      startX = endX; 
      startY = endY; 
      timeOfLastExecute.set(System.currentTimeMillis()); 
     } 
    }); 
+0

Вы должны предоставить некоторое объяснение (посмотрите на [this] (http://meta.stackoverflow.com/a/260413/3429133) на Meta). – beatngu13

0

Вы можете использовать AnimationTimer, который (пытается) работает со скоростью 60 кадров в second.So каждый раз, 10 секунд, вы выполняете код (Вы должны начать AnimationTimer каждый раз):


Код:

public void startTimer(){ 

    AnimationTimer timer = new AnimationTimer() { 
      int seconds; 
     @Override 
     public void handle(long now) { 

       //every time 10 seconds have passed 
       //note that 1 second=1000 milliseconds=1.000.000 nanoseconds 
       //now->variable which represents nano seconds 
       if(now%10000000 == 0){ 

        endX = e.getX(); 
        endY = e.getY(); 
       Bounds viewBounds = mapScroll.getViewportBounds(); 
       double startEndX = startX - endX; 
       double startEndY = startY - endY; 

       Bounds contentBounds = mapScroll.getContent().getLayoutBounds(); 

       double hChange = startEndX/(contentBounds.getWidth() - viewBounds.getWidth()); 
       double vChange = startEndY/(contentBounds.getHeight() - viewBounds.getHeight()); 
       mapScroll.setHvalue(mapScroll.getHvalue() + hChange); 
       mapScroll.setVvalue(mapScroll.getVvalue() + vChange); 

       startX = endX; 
       startY = endY; 

       } 
      } 
     } 
    } 

    timer.start(); 

}