2017-01-19 14 views
0

Я новичок в JavaFX, и мне нужно определить положение мыши, когда пользователь перетаскивает какой-то файл из-за пределов моего приложения, например, его ОС. Я добавил перехватчик для dragEntered и dragExited, как это:Запросить фокус при перетаскивании из окон

EventHandler<MouseEvent> mouseMoved = new EventHandler<MouseEvent>() { 

    @Override 
    public void handle(MouseEvent event) { 
     logger.severe(event.getScreenX() + " : " + event.getScreenY()); 
    } 
}; 

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
     scrollPane.getScene().getWindow().requestFocus(); 
     scrollPane.requestFocus(); 
     event.consume(); 
     isDragging = true; 
     logger.severe(event.getScreenX() + " : " + event.getScreenY()); 
     scrollPane.addEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

scrollPane.setOnDragExited(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
     isDragging = false; 
     event.consume(); 
     scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

scrollPane.setOnDragDropped(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
     isDragging = false; 
     event.consume(); 
     scrollPane.removeEventHandler(MouseEvent.MOUSE_MOVED, mouseMoved); 
    } 
}); 

успешно детектирует, что пользователь ввел мой взгляд, таща что-то, но так как пользователь нажал вне моего приложения, мой узел не имеет фокус, и я также не может запроситьфокусировку, поскольку основное внимание уделяется ОС - поэтому я не могу добавить MouseEventHandler на свой узел scrollPane для обнаружения движения мыши. Мне нужно это, чтобы реализовать интеллектуальную прокрутку, поэтому, когда пользователь перетаскивает мою ScrollPane, он может перемещать мышь в нижней части узла, и она будет плавно прокручиваться вниз.

Может кто-нибудь помочь мне в этом вопросе?

+1

Не проверен, но помогает ли он сначала запросить фокус на окне, т. Е. Выполнить 'scrollPane.getScene(). GetWindow(). RequestFocus()' перед вызовом 'scrollPane.requestFocus()'? –

+0

Спасибо, что ответили. Это действительно меняет фокус на моем приложении (я вижу на панели задач), но, тем не менее, обработчик событий для MOUSE_MOVED не работает. – Robert

ответ

0

С помощью я получил от @James_D, мне удалось получить позицию мыши в любом движении, используя setOnDragOver. Если у кого есть такая же проблема, вот как мой код выглядит сейчас:

scrollPane.setOnDragEntered(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
    scrollPane.getScene().getWindow().requestFocus(); 
    scrollPane.requestFocus(); 
    event.consume(); 
    isDragging = true; 

    } 
}); 

scrollPane.setOnDragOver(new EventHandler<DragEvent>() { 

    @Override 
    public void handle(DragEvent event) { 
    double windowHeight = scrollPane.getHeight(); 
    double topBar = (20*windowHeight)/100; 
    double bottomBar = windowHeight - topBar; 
    event.acceptTransferModes(TransferMode.LINK); 
    if(event.getY() > 0 && event.getY() < topBar && scrollPane.getVvalue() > 0) 
    scrollPane.setVvalue(scrollPane.getVvalue()-0.001); 
    else if(event.getY() < windowHeight && event.getY() > bottomBar && scrollPane.getVvalue() < 1) 
    scrollPane.setVvalue(scrollPane.getVvalue()+0.001); 
    } 

}); 

scrollPane.setOnDragExited(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
    isDragging = false; 
    event.consume(); 
    } 
}); 

scrollPane.setOnDragDropped(new EventHandler<Event>() { 
    @Override 
    public void handle(Event event) { 
    isDragging = false; 
    event.consume(); 
    } 
}); 

И это обеспечивает смарт прокрутки, во время перетаскивания, что означает, что если перетащить файл из ОС (например) в приложение на scrollPane, если вы нажмете мышь на 20% от указанной scrollPane, она будет медленно прокручиваться вниз и так же, если вы переместите мышь на верхние 20% от scrollPane - она ​​прокручивается вверх.

Благодарим за помощь, и если у вас есть какие-либо другие замечания, я бы с удовольствием прочитал их.

0

Использование DragEvent вместо события, например:

scrollPane.setOnDragExited(new EventHandler<Event>() { 
     @Override 
     public void handle(Event event) { 
      event.consume(); 
      event.getScreenX(); // To get x position 
      event.getScreenY(); // To get y position 
      mouseOnTemplateBasker = false; 
      logger.severe("Exited dragging something"); 

     } 
    }); 
+0

Благодарим вас за ответ. Действительно, теперь я могу получить положение X/Y мыши, но только когда он покидает мое мнение. Мне нужен какой-то eventHandler, когда пользователь перемещает мышь - при перетаскивании - поверх моей scrollPane. – Robert