Как прекратить событие setOnMouseMoved? - PullRequest
0 голосов
/ 13 марта 2020

Я пытался создать приложение, и одна из функций - выделение области.

Я использовал пользовательское контекстное меню. если я выбрал действие из моего контекстного меню - прямоугольник добавляется в WebView

. Это работает, и я вижу область, которую хочу выделить. Но если я нажал вторичную кнопку мыши - я хочу завершить это событие, но setOnMouseMoved работает после того, как я нажму вторичную или основную кнопку. Итак, я могу прекратить событие?

package sample;

import java.net.URL;
import java.util.ArrayList;
import java.util.ResourceBundle;
import javafx.fxml.FXML;
import javafx.scene.input.MouseButton;
import javafx.scene.layout.AnchorPane;
import javafx.scene.shape.Rectangle;
import javafx.scene.web.WebView;

public class Controller {

    @FXML
    private ResourceBundle resources;

    @FXML
    private URL location;

    @FXML
    private AnchorPane anchorPane;

    @FXML
    private WebView webView;

    @FXML
    void initialize() {
        MenuItem.initContextMenu();
        webView.setContextMenuEnabled(false);
        webView.setOnMousePressed(event -> {
            if (event.getButton() == MouseButton.SECONDARY) {
                double x = event.getX();
                double y = event.getY();
                MenuItem.x = x;
                MenuItem.y = y;
                MenuItem.anchorPane = anchorPane;
                MenuItem.webView = webView;
                MenuItem.contextMenu.show(webView, event.getScreenX(), event.getScreenY());
            }
        });
    }

    static class MenuItem {
        static WebView webView;
        static AnchorPane anchorPane;
        static Rectangle rectangle;
        static double x;
        static double y;
        static ArrayList<javafx.scene.control.MenuItem> items = new ArrayList<>();
        static javafx.scene.control.ContextMenu contextMenu;

        public static void initContextMenu() {
            contextMenu = new javafx.scene.control.ContextMenu();
            contextMenu.getItems().addAll(MenuItem.initItems());
        }

        public static ArrayList<javafx.scene.control.MenuItem> initItems() {
            items.add(new javafx.scene.control.MenuItem("Screenshot"));
            items.get(0).setOnAction(event -> {
                webView.setOnMouseMoved(event1 -> {
                    double min_x = MenuItem.x;
                    double min_y = MenuItem.y;
                    double delta_x = 0;
                    double delta_y = 0;

                    double x = event1.getX();
                    double y = event1.getY();

                    if (min_x > x) {
                        min_x = x;
                        delta_x = MenuItem.x - min_x;
                    } else {
                        delta_x = x - min_x;
                    }
                    if (min_y > y) {
                        min_y = y;
                        delta_y = MenuItem.y - min_y;
                    } else {
                        delta_y = y - min_y;
                    }

                    javafx.scene.shape.Rectangle rectangle = new Rectangle((int) Math.round(min_x), (int) Math.round(min_y), delta_x, delta_y);
                    rectangle.setMouseTransparent(true);
                    if (MenuItem.anchorPane.getChildren().contains(MenuItem.rectangle)) {
                        MenuItem.anchorPane.getChildren().remove(MenuItem.rectangle);
                    }
                    MenuItem.rectangle = rectangle;
                    MenuItem.anchorPane.getChildren().add(rectangle);
                });
                webView.setOnMousePressed(event1 -> {
                    if (event1.getButton() == MouseButton.SECONDARY || event1.getButton() == MouseButton.PRIMARY) {
                        MenuItem.anchorPane.getChildren().remove(MenuItem.rectangle);
                        /* Terminate highlighting
                        break;
                        return;
                        I don't know :( */
                    }
                });
            });
            return items;
        }
    }
}

F XML

    <?xml version="1.0" encoding="UTF-8"?>

    <?import javafx.scene.layout.AnchorPane?>
    <?import javafx.scene.web.WebView?>

    <AnchorPane fx:id="anchorPane" maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="400.0" prefWidth="600.0" xmlns="http://javafx.com/javafx/8.0.171" xmlns:fx="http://javafx.com/fxml/1" fx:controller="sample.Controller">
       <children>
          <WebView fx:id="webView" layoutX="152.0" layoutY="53.0" prefHeight="200.0" prefWidth="200.0" AnchorPane.bottomAnchor="0.0" AnchorPane.leftAnchor="0.0" AnchorPane.rightAnchor="0.0" AnchorPane.topAnchor="0.0" />
       </children>
    </AnchorPane>
...