Я пытался создать приложение, и одна из функций - выделение области.
Я использовал пользовательское контекстное меню. если я выбрал действие из моего контекстного меню - прямоугольник добавляется в 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>