持有按钮Javafx

问题描述 投票:0回答:1

如何为我的应用程序实现一个系统,让我在持有左鼠标按钮时为下面显示的这些矩形上色吗?当发布时,它停止着色。我搜索了互联网的谷,但我仍然不明白这些鼠标量如何工作。

Rectangles to color

java user-interface javafx mouseevent mouse
1个回答
4
投票

javafx.scene.input.MouseEvent

的文档:

draging手势

有三种类型的拖动手势。它们都是由鼠标新闻事件启动的,并由于释放的鼠标释放事件而终止,源节点决定要进行哪些手势。 简单的压力释放手势是默认的。它最好用于更改形状的尺寸,将其拖动等等。将整个压力释放的手势传递到一个节点。按下鼠标按钮时,选择了最高的节点,然后将所有随后的鼠标事件传递到同一节点,直到释放按钮为止。如果从这些事件中生成鼠标单击事件,则仍将其传递到同一节点。

为简单的新闻释放手势,其他节点不参与,也没有得到任何事件。如果这些节点需要参与手势,则必须激活全压力释放的手势。这种手势最适合通过“电线”连接节点,将节点拖动到其他节点等。这种手势类型在

MouseDragEvent

上更仔细地描述,其中包含传递给手势目标的事件。

第三种手势类型是平台支持的拖放手势。它最适合传输数据并在(不一定是FX)应用程序之间工作。这种手势类型在

DragEvent

中更加紧密地描述。

在简短的摘要中,当按下鼠标按钮并将所有
MouseEvent

交付到手势源时,自动激活了简单的压力释放手势。当您开始拖动时,最终

DRAG_DETECTED

事件到达。在其处理程序中,您可以通过在节点或场景上调用
startFullDrag

方法来启动完整的压力释放手势 -

MouseDragEvent

开始传递给手势目标,也可以通过调用
开始拖动手势。 startDragAndDrop
节点或场景上的方法 - 系统切换到拖放模式,并且开始传递而不是
DragEvent
S。如果您不调用这些方法中的任何一种,那么简单的压力释放手势仍在继续。
  
  
[...]


如果我正确理解您的问题,您希望能够将鼠标拖到多个节点上,并让它们做出反应,这是一个手势。您需要使用
按拖纸释放的手势来实现这一目标。如有记录,您必须聆听
MouseEvent
事件并致电

DRAG_DETECTED

Node#startFullDrag()激活

fullPress-Drag-Release
手势。然后,UI中的每个“正方形”都需要聆听Scene#startFullDrag()
事件。请注意,事件类型为
MOUSE_DRAG_ENTERED
not
这里是一个例子: MOUSE_DRAG_ENTERED
上面通过在根上设置
MOUSE_ENTERED
属性来聆听事件。请注意,如果您开始拖动其中一个,则该事件将起泡到根,并由上述处理程序处理。另外,由于您明确提及left鼠标按钮,因此添加了检查鼠标按钮是否为主要按钮。

然后每个
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(2)); root.setVgap(2); root.setHgap(2); // start full press-drag-release gesture root.setOnDragDetected( event -> { if (event.getButton() == MouseButton.PRIMARY) { event.consume(); root.startFullDrag(); } }); for (int i = 0; i < 12; i++) { for (int j = 0; j < 12; j++) { Rectangle rect = new Rectangle(50, 50, 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(); } }

通过设置

DRAG_DETECTED
属性设置来聆听

Node#onDragDetected

事件。这些事件只有在有生效的手势时才提供这些事件。
    
最新问题
© www.soinside.com 2019 - 2025. All rights reserved.