如何在TitledPane的拖放过程中正确设置鼠标光标,并在Javafx中使用两个Accordion

时间:2016-10-13 21:17:52

标签: javafx drag-and-drop mouseevent javafx-8

在下面的代码示例中,处理两个Accordion窗格之间的TitledPanes拖放。 拖放工作正常,但问题是正确设置鼠标指针。 执行拖动时,光标设置正确。 拖动完成后,光标在大多数部分设置为默认值。 TitledPane的标题是例外,其中MOVE光标仍然设置。 DragDetected事件似乎在TitledPane的某个内部类中,请参阅事件的打印输出。 不应该做这项工作或我在这里做错了什么?

package javafxapplication4;

import java.util.function.Consumer;
import javafx.application.Application;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.Cursor;
import javafx.scene.Node;
import javafx.scene.Parent;
import javafx.scene.Scene;
import javafx.scene.control.Accordion;
import javafx.scene.control.Button;
import javafx.scene.control.Label;
import javafx.scene.control.TextArea;
import javafx.scene.control.TitledPane;
import javafx.scene.input.MouseDragEvent;
import javafx.scene.input.MouseEvent;
import javafx.scene.layout.Background;
import javafx.scene.layout.HBox;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;

/**
 *
 * @author Daniel
 */
public class JavaFXApplication4 extends Application {

    @Override
    public void start(Stage primaryStage) {
        StackPane root = new StackPane();
        HBox hb = new HBox();
        VBox vb1 = new VBox();
        VBox vb2 = new VBox();
        vb1.setPrefHeight(200);
        vb2.setPrefHeight(200);
        Label l1 = new Label("L1");
        Label l2 = new Label("L2");
        Accordion ac1 = new Accordion();
        ac1.setPrefSize(100, 200);
        Accordion ac2 = new Accordion();
        ac2.setPrefSize(100, 200);
        TextArea ta1 = new TextArea();
        TitledPane tp1 = new TitledPane("TP1", ta1);
        ac1.getPanes().add(tp1);
        TextArea ta2 = new TextArea();
        TitledPane tp2 = new TitledPane("TP2", ta2);
        ac2.getPanes().add(tp2);
        vb1.getChildren().add(l1);
        vb2.getChildren().add(l2);
        vb1.getChildren().add(ac1);
        vb2.getChildren().add(ac2);
        hb.getChildren().add(vb1);
        hb.getChildren().add(vb2);

        ac1.setOnMouseDragEntered(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("dragEntered " + event.toString());
                Consumer<Node> se = s -> s.setMouseTransparent(true);
                ac1.getPanes().forEach(se);
                event.consume();
            }
        });

        ac1.setOnMouseDragExited(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("dragExited " + event.toString());
                Consumer<Node> se = s -> s.setMouseTransparent(false);
                ac1.getPanes().forEach(se);
                event.consume();
            }
        });

        ac1.setOnMouseDragReleased(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("dragReleased " + event.toString());
                TitledPane node = (TitledPane) event.getGestureSource();
                Accordion parent = (Accordion) node.getParent();
                parent.getPanes().remove(node);
                Accordion newParent = (Accordion) event.getTarget();
                newParent.getPanes().add(node);
                ((Node) event.getGestureSource()).setCursor(Cursor.DEFAULT);

                event.consume();
            }
        });
        ac2.setOnMouseDragEntered(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("dragEntered " + event.toString());
                Consumer<Node> se = s -> s.setMouseTransparent(true);
                ac2.getPanes().forEach(se);
                event.consume();
            }
        });

        ac2.setOnMouseDragExited(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("dragExited " + event.toString());
                Consumer<Node> se = s -> s.setMouseTransparent(false);
                ac2.getPanes().forEach(se);
                event.consume();
            }
        });

        ac2.setOnMouseDragReleased(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("dragReleased " + event.toString());
                TitledPane node = (TitledPane) event.getGestureSource();
                Accordion parent = (Accordion) node.getParent();
                parent.getPanes().remove(node);
                Accordion newParent = (Accordion) event.getTarget();
                newParent.getPanes().add(node);
                ((Node) event.getGestureSource()).setCursor(Cursor.DEFAULT);

                event.consume();
            }
        });

        tp1.setOnDragDetected(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                System.out.println("handle dragDetected " + event);
                tp1.startFullDrag();
                ((Node) event.getTarget()).setCursor(Cursor.MOVE);
                //tp1.setCursor(Cursor.MOVE); // Doesn't work - default cursor
                event.consume();
            }

        });
        tp1.setOnMouseDragReleased(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("TitledPane mouseDragReleased " + event);
                TitledPane node = (TitledPane) event.getGestureSource();
                Accordion parent = (Accordion) node.getParent();
                parent.getPanes().remove(node);
                Accordion newParent = (Accordion) ((TitledPane) event.getSource()).getParent();
                newParent.getPanes().add(node);
                event.consume();
            }
        });
        tp2.setOnDragDetected(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent event) {
                System.out.println("handle dragDetected " + event);
                ((Node) event.getTarget()).setCursor(Cursor.MOVE);
                //tp2.setCursor(Cursor.MOVE);// Doesn't work - default cursor
                tp2.startFullDrag();
                event.consume();
            }

        });
        tp2.setOnMouseDragReleased(new EventHandler<MouseDragEvent>() {
            @Override
            public void handle(MouseDragEvent event) {
                System.out.println("TitledPane mouseDragReleased " + event);
                TitledPane node = (TitledPane) event.getGestureSource();
                Accordion parent = (Accordion) node.getParent();
                parent.getPanes().remove(node);
                Accordion newParent = (Accordion) ((TitledPane) event.getSource()).getParent();
                newParent.getPanes().add(node);
                event.consume();
            }
        });
        root.getChildren().add(hb);

        Scene scene = new Scene(root, 300, 250);

        primaryStage.setTitle("Drag drop mouse cursor example");
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    /**
     * @param args the command line arguments
     */
    public static void main(String[] args) {
        launch(args);
    }

}

它为拖放生成此输出:

handle dragDetected MouseEvent [source = TitledPane@44ce2e46[styleClass=titled-pane first-titled-pane]'TP1', target = TitledPaneSkin$TitleRegion@451c360f[styleClass=title], eventType = DRAG_DETECTED, consumed = false, x = 71.0, y = 4.0, z = 0.0, button = PRIMARY, primaryButtonDown, pickResult = PickResult [node = TitledPaneSkin$TitleRegion@451c360f[styleClass=title], point = Point3D [x = 71.0, y = 4.0, z = 0.0], distance = 466.5063509461097]
dragEntered MouseDragEvent [source = Accordion@19ef71a8[styleClass=accordion], target = Accordion@19ef71a8[styleClass=accordion], gestureSource = TitledPane@44ce2e46[styleClass=titled-pane first-titled-pane]'TP1', eventType = MOUSE-DRAG_ENTERED, consumed = false, x = 71.0, y = 4.0, z = 0.0, button = PRIMARY, primaryButtonDown, pickResult = PickResult [node = TitledPaneSkin$TitleRegion@451c360f[styleClass=title], point = Point3D [x = 71.0, y = 4.0, z = 0.0], distance = 466.5063509461097]
dragExited MouseDragEvent [source = Accordion@19ef71a8[styleClass=accordion], target = Accordion@19ef71a8[styleClass=accordion], gestureSource = TitledPane@44ce2e46[styleClass=titled-pane first-titled-pane]'TP1', eventType = MOUSE-DRAG_EXITED, consumed = false, x = 108.0, y = 3.0, z = 0.0, button = PRIMARY, primaryButtonDown, pickResult = PickResult [node = TitledPaneSkin$TitleRegion@1f91afb1[styleClass=title], point = Point3D [x = 8.0, y = 3.0, z = 0.0], distance = 466.5063509461097]
dragEntered MouseDragEvent [source = Accordion@77b6ca53[styleClass=accordion], target = Accordion@77b6ca53[styleClass=accordion], gestureSource = TitledPane@44ce2e46[styleClass=titled-pane first-titled-pane]'TP1', eventType = MOUSE-DRAG_ENTERED, consumed = false, x = 8.0, y = 3.0, z = 0.0, button = PRIMARY, primaryButtonDown, pickResult = PickResult [node = TitledPaneSkin$TitleRegion@1f91afb1[styleClass=title], point = Point3D [x = 8.0, y = 3.0, z = 0.0], distance = 466.5063509461097]
dragReleased MouseDragEvent [source = Accordion@77b6ca53[styleClass=accordion], target = Accordion@77b6ca53[styleClass=accordion], gestureSource = TitledPane@44ce2e46[styleClass=titled-pane first-titled-pane]'TP1', eventType = MOUSE-DRAG_RELEASED, consumed = false, x = 70.0, y = 64.0, z = 0.0, button = PRIMARY, pickResult = PickResult [node = Accordion@77b6ca53[styleClass=accordion], point = Point3D [x = 70.0, y = 64.0, z = 0.0], distance = 466.5063509461097]
dragExited MouseDragEvent [source = Accordion@77b6ca53[styleClass=accordion], target = Accordion@77b6ca53[styleClass=accordion], gestureSource = TitledPane@44ce2e46[styleClass=titled-pane]'TP1', eventType = MOUSE-DRAG_EXITED, consumed = false, x = 70.0, y = 64.0, z = 0.0, button = PRIMARY, pickResult = PickResult [node = Accordion@77b6ca53[styleClass=accordion], point = Point3D [x = 70.0, y = 64.0, z = 0.0], distance = 466.5063509461097]

奇怪的部分是 target = TitledPaneSkin $ TitleRegion @ 451c360f [styleClass = title] 我本来希望TitledPane在那里。 我认为这就是为什么鼠标光标没有正确复位的原因。

0 个答案:

没有答案