Как заставить JavaFX ScrollPane продолжать прокручиваться, если кнопка внутри ScrollPane перетаскивается?

У меня есть панель прокрутки JavaFX внутри панели JFXPanel в моем проекте Java. Этот проект будет на сенсорных мониторах без клавиатуры, поэтому мне нужно эмулировать прокрутку на сенсорном экране.

Проблема в; если я перетаскиваю мышь в ScrollPane, она работает нормально, но если я перетаскиваю мышь туда, где есть кнопки, она не может прокручиваться (и идея заключается в том, что ScrollPane будет заполнен кнопками без пробела между ними).

Белая часть и кнопки находятся внутри панели прокрутки

Вот часть, которая создает ScrollPane в моем коде.

    private static Scene createScene(int wS, int hS) {
        ScrollPane scrollPane = new ScrollPane();
        FlowPane flowpane = new FlowPane();
        
        scrollPane.setCache(true);
        scrollPane.setVbarPolicy(ScrollPane.ScrollBarPolicy.NEVER);
        scrollPane.setPannable(true);

        for(int i=0; i<100; i++)
            flowpane.getChildren().add((new ButtonProduct(wS, "Apple " + (i+1)));
        
        scrollPane.setContent(flowpane);
        Scene  scene  =  new  Scene(scrollPane);
        return (scene);
    }

ИЗМЕНИТЬ:

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

    public ButtonProduct(int wS, String t) {
        this.setText(t);
        this.setMinSize((int) (wS*sizeW), (int) (wS*sizeW));
        this.setPrefSize((int) (wS*sizeW), (int) (wS*sizeW));
        this.setMaxSize((int) (wS*sizeW), (int) (wS*sizeW));
        this.setOnDragDetected(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                System.out.println("Dragged Button");
                e.consume();
            }
        });
    }

person Sebastian Torres    schedule 30.01.2021    source источник
comment
При чем здесь Swing?   -  person Andrew Thompson    schedule 30.01.2021
comment
Снимок в темноте, но я предполагаю, что вам нужно будет зафиксировать событие щелчка мыши, определить, является ли это жестом (например, скольжением пальца вместо простого нажатия), и реагировать соответствующим образом. Но сам вопрос здесь слишком широк.   -  person Zephyr    schedule 30.01.2021


Ответы (1)


Я нашел ответ, это код кнопки (узла) внутри панели прокрутки. НО вам нужно восстановить событие кнопки для лучшей производительности, которая не разработана в следующем коде.

import javax.swing.*;
import java.awt.*;
import javafx.event.ActionEvent;
import javafx.event.EventHandler;
import javafx.scene.control.Button;
import javafx.scene.input.MouseEvent;
import javafx.scene.control.ScrollPane;

public class ButtonProduct extends Button {
    private static double sizeW = .075;
    //Constructor
    public ButtonProduct(ScrollPane sC, int wS, String t) {
        this.setText(t);
        this.setMinSize((int) (wS*sizeW), (int) (wS*sizeW));
        this.setPrefSize((int) (wS*sizeW), (int) (wS*sizeW));
        this.setMaxSize((int) (wS*sizeW), (int) (wS*sizeW));
        this.setOnDragDetected(new EventHandler<MouseEvent>() {
            @Override
            public void handle(MouseEvent e) {
                ((Button) e.getSource()).setEventDispatcher(sC.getEventDispatcher());
                sC.requestFocus();
                e.consume();
            }
        });
    }
}
person Sebastian Torres    schedule 31.01.2021