在按住按钮JavaFX的同时对多个节点进行鼠标拖动检测

原学程将引见在按住按钮JavaFX的同时对于多个节面停止鼠标拖动检测的处置办法,这篇学程是从其余处所瞅到的,而后减了1些海外法式员的疑问与解问,愿望能对于您有所赞助,佳了,上面开端进修吧。

在按住按钮JavaFX的同时对多个节点进行鼠标拖动检测 教程 第1张

成绩描写

我将直交答复这个成绩。我怎样为我的运用法式完成1个体系,让我在按住鼠标左键的同时为上面显示的这些矩形上色?当它被开释时,它便会停滞着色。我经由过程互联网搜刮了1下,但是我依然没有明确这些鼠标事宜是怎样任务的。

祝您有高兴的1天!

推举谜底

去自javafx.scene.input.MouseEvent的文档:

有3品种型的拖着手势。它们皆是由鼠标按下事宜开动的,并因为鼠标开释事宜而终止,源节面决议将产生哪一个脚势。

默许树立为简略的按下-拖动-开释脚势。它最合适用于变动外形的年夜小、拖动外形等等。全部按下-拖动-开释脚势被传播到1个节面。按下鼠标按钮时,将拾与最顶真个节面,并将一切后续鼠标事宜传播到统一节面,直到开释该按钮。假如鼠标单打事宜是从这些事宜死成的,它仍会传播到统一节面。

在简略的按下拖动开释脚势时代,其余节面没有会介入,也没有会取得所有事宜。假如这些节面须要介入脚势,则必需激活完全的按下-拖动-开释脚势。此脚势最合适用于经由过程"Wire"衔接节面、将节面拖动到其余节面等。MouseDragEvent中对于此脚势典型的描写更加具体,它包括传播得手势目的的事宜。

第3种脚势典型是仄台支撑的拖撒手势。它最合适于传输数据,也实用于运用法式之间(纷歧定是FX)。此脚势典型在DragEvent中有更具体的描写。

简而言之,当按下鼠标按键时,会主动激活简略的按下拖动开释脚势,并将一切MouseEvent收送得手势源。当您开端拖动时,DRAG_DETECTED事宜终究会达到。在其处置法式中,您不妨经由过程在节面或者场景上浮用startFullDrag办法去开动完全的按拖撒手势--MouseDragEvent开端传播得手势目的,或许您不妨经由过程在节面或者场景上浮用startDragAndDrop办法去开端拖撒手势-体系切换到拖搁形式,DragEvent开端传播,而没有是MouseEvent。假如您没有挪用这些办法中的所有1个,则简略的按拖撒手势将持续。

[...]

假如我准确懂得了您的成绩,您愿望可以或许将鼠标拖动到多个节面上并让它们做出反响,一切操纵皆在1个脚势中完成。叨教须要应用完全的
按下-拖动-开释脚势便可完成此操纵。如前所述,您必需侦听DRAG_DETECTED事宜并挪用Node#startFullDrag()或者Scene#startFullDrag()以激活脚势。而后,您的用户界里中的每一个"正圆形"皆须要侦听MOUSE_DRAG_ENTERED事宜。请留意,事宜典型为MOUSE_DRAG_ENTERED以及MOUSE_ENTERED

举个例子:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.layout.GridPane;
import javafx.scene.paint.Color;
import javafx.scene.shape.Rectangle;
import javafx.stage.Stage;

public class App extends Application {

  @Override
  public void start(Stage primaryStage) {
 GridPane root = new GridPane();
 root.setPadding(new Insets(二));
 root.setVgap(二);
 root.setHgap(二);

 // start full press-drag-release gesture
 root.setOnDragDetected(
  event -> {
 if (event.getButton() == MouseButton.PRIMARY) {
event.consume();
root.startFullDrag();
 }
  });

 for (int i = 0; i < 一二; i++) {
for (int j = 0; j < 一二; j++) {
  Rectangle rect = new Rectangle(五0, 五0, Color.WHITE);
  rect.setStroke(Color.BLACK);
  root.add(rect, i, j);

  // detect MOUSE_DRAG_ENTERED events
  rect.setOnMouseDragEntered(
event -> {
  event.consume();
  rect.setFill(Color.BLACK);
});
}
 }

 primaryStage.setTitle("MouseDragEvent Example");
 primaryStage.setScene(new Scene(root));
 primaryStage.show();
  }
}

上述经由过程在根GridPane上树立Node#onDragDetected属性去侦听DRAG_DETECTED事宜。请留意,假如您开端在个中1个Rectangle上拖动,则事宜将向上冒泡到根,并由后面提到的处置法式处置。别的,因为您明白提到了鼠标按键,是以我添减了鼠标按键能否为主按键的检讨。

而后,每一个Rectangle经由过程树立其Node#onMouseDragEntered属性去侦听MOUSE_DRAG_ENTERED事宜。仅当脚势失效时,才会传播这些事宜。

佳了闭于在按住按钮JavaFX的同时对于多个节面停止鼠标拖动检测的学程便到这里便停止了,愿望趣模板源码网找到的这篇技巧文章能赞助到年夜野,更多技巧学程不妨在站内搜刮。