2014-09-01 4 views
0

Я разрабатываю проект javafx, и мне нужно что-то похожее на нажатие и удержание сенсорного события, но мне оно нужно как событие мыши, потому что у меня возникают проблемы с Linux и javafx, и я пробовал события касания, но Ubuntu выиграл Не реагируйте на события касания. Итак, какие-либо идеи о том, как достичь события или как активировать сенсорное событие javafx на Linux?Как достичь события мыши javafx «нажмите и удерживайте»?

+0

Не нажимайте и не держите нажатие мыши без мыши? – MadProgrammer

+0

Да, но мышь примет это как обнаруженное событие. –

+0

Я не пробовал, но не было бы событием перетаскивания, только если мышь была перемещена ... что это было бы событием перетаскивания, но все-таки нужно было выпустить выпуск мыши ... возможно, что-то действительно пропало Очевидный – MadProgrammer

ответ

5

Просто используйте PauseTransition как таймер для «удержания». Запустите его, если мышь нажата, остановите ее, если она отпущена или перетащена.

import javafx.animation.PauseTransition; 
import javafx.application.Application; 
import javafx.event.EventHandler; 
import javafx.scene.Node; 
import javafx.scene.Scene; 
import javafx.scene.input.MouseEvent; 
import javafx.scene.layout.Pane; 
import javafx.stage.Stage; 
import javafx.util.Duration; 

public class MousePressAndHoldTest extends Application { 

    @Override 
    public void start(Stage primaryStage) { 
     Pane root = new Pane(); 

     addPressAndHoldHandler(root, Duration.seconds(1), 
       event -> System.out.println("Press and hold")); 


     primaryStage.setScene(new Scene(root, 400, 400)); 
     primaryStage.show(); 
    } 

    private void addPressAndHoldHandler(Node node, Duration holdTime, 
      EventHandler<MouseEvent> handler) { 

     class Wrapper<T> { T content ; } 
     Wrapper<MouseEvent> eventWrapper = new Wrapper<>(); 

     PauseTransition holdTimer = new PauseTransition(holdTime); 
     holdTimer.setOnFinished(event -> handler.handle(eventWrapper.content)); 


     node.addEventHandler(MouseEvent.MOUSE_PRESSED, event -> { 
      eventWrapper.content = event ; 
      holdTimer.playFromStart(); 
     }); 
     node.addEventHandler(MouseEvent.MOUSE_RELEASED, event -> holdTimer.stop()); 
     node.addEventHandler(MouseEvent.DRAG_DETECTED, event -> holdTimer.stop()); 
    } 


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

он работал как шарм. : D :-)^_^........... –

+0

теперь у меня есть проблема, что у меня на том же узле есть обработчик события «dragdetected», и есть какая-то сложность, поэтому вырезание на погоню, когда таймер закончен (таймер в вашем коде), я хочу, чтобы приложение отпустило кнопку мыши, чтобы обработчик «dragdeteted» не работал. –

+0

Я не могу видеть хороший способ сделать это - я думаю, вам просто нужно установить флаг в true, когда таймер закончится, сбросьте его на false в выведенном вами прослушивателе и проверите его при обнаружении вашего сопротивления, только действуя, если флаг является ложным. –

Смежные вопросы