установить "быстрый" клик - JavaFx - PullRequest
0 голосов
/ 31 января 2019

У меня есть кнопка , по которой я могу переместить ее с экрана, при нажатии на которую есть действие.Проблема в том, что когда я делаю Drag'n Drop, вызывается событие click, когда я отпускаю мышь, я пробовал:

setOnMouseClicked setOnAction setOnMousePressed

Как можноЯ просто вызываю функцию щелчка, когда это быстрый щелчок, что-то вроде времени Android, которое может различаться, потому что у нас setOnLongClick, то есть различие, когда я выполняю Drag'n Drop и когда я действительно хочу нажать?

Пример:

Чтобы переместиться, выполните:

button.setOnMouseDragged(e -> {
     //code move
});

To eventClick:

button.setOnMouseClicked/ Action / MousePressed (e -> {
    //call method
});

Но когда я его отбрасываю, он вызывает setOnMouseClicked / Action / MousePressedя хочу, чтобы он просто звонил на случай, если я сделаю быстрый щелчок, когда я бросаю, drag'n drop не вызывает.

enter image description here

1 Ответ

0 голосов
/ 31 января 2019

Один из вариантов - отслеживать, был ли перетащен Button;если нет, только тогда выполните код в обработчике onAction.Вот пример:

import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.geometry.Point2D;
import javafx.scene.Group;
import javafx.scene.Scene;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.stage.Stage;

public class Main extends Application {

  private Point2D origin;
  private boolean wasDragged;

  @Override
  public void start(Stage primaryStage) {
    Button button = new Button("Drag me!");
    button.setOnAction(this::onAction);
    button.setOnMousePressed(this::onMousePressed);
    button.setOnMouseDragged(this::onMouseDragged);
    button.setOnMouseReleased(this::onMouseReleased);

    primaryStage.setScene(new Scene(new Group(button), 800, 600));
    primaryStage.show();
  }

  private void onAction(ActionEvent event) {
    event.consume();

    if (!wasDragged) {
      System.out.println("onAction");
    }
  }

  private void onMousePressed(MouseEvent event) {
    event.consume();
    origin = new Point2D(event.getX(), event.getY());

    System.out.println("onMousePressed");
  }

  private void onMouseDragged(MouseEvent event) {
    event.consume();
    wasDragged = true;

    Button source = (Button) event.getSource();
    source.setTranslateX(source.getTranslateX() + event.getX() - origin.getX());
    source.setTranslateY(source.getTranslateY() + event.getY() - origin.getY());
  }

  private void onMouseReleased(MouseEvent event) {
    event.consume();
    origin = null;
    wasDragged = false;

    System.out.println("onMouseReleased");
    System.out.println();
  }

}

К сожалению, я не могу найти документацию, гарантирующую, что обработчик onAction всегда вызывается перед обработчиком onMouseReleased, но это работало как на Java 8u202, так и на JavaFX 11.0.2, когдаЯ попробовал это.

...