Как запретить прокрутку JavaFX ScrollPane?
Имеется следующая структура элементов на окне JFrame:

На JFrame расположена JPanel с JScrollPane. На этой панели располагается некое множество панелей со ScrollPane и WebView JavaFX. При этом каждому скролу заданы параметры: scrollPane.setHbarPolicy(ScrollBarPolicy.NEVER); scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER);, скрывающие отображение элементов перемещения. Мне необходимо полностью запретить скроллинг на элементах ScrollPane.
Пробовал варианты: scrollPane.setVmax(0); scrollPane.setFitToWidth(true); scrollPane.setFitToHeight(true); scrollPane.setDisable(false);
Проблема заключается в том, что ScrollPane и WebView мешают спокойно скролить джавовский JScrollPane, потому как если курсор наведен на них, то прокрутка JScrollPane не работает
import java.awt.BorderLayout;
import java.awt.Color;
import java.awt.Dimension;
import java.awt.GridBagConstraints;
import java.awt.GridBagLayout;
import java.awt.Insets;
import javax.swing.JFrame;
import javax.swing.JPanel;
import javax.swing.JScrollPane;
import javax.swing.border.EmptyBorder;
import javafx.application.Platform;
import javafx.embed.swing.JFXPanel;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.control.ScrollPane.ScrollBarPolicy;
import javafx.scene.web.WebEngine;
import javafx.scene.web.WebView;
public class basic {
public static void main(String Args[]) {
JFrame frame = new JFrame();
frame.getContentPane().setLayout(new BorderLayout());
frame.getContentPane().setBackground(Color.GRAY);
frame.setSize(800, 500);
frame.setVisible(true);
GridBagLayout gblClipboard = new GridBagLayout();
GridBagConstraints gbCClipboard = new GridBagConstraints();
gbCClipboard.gridx = 0;
gbCClipboard.weightx = 1;
gbCClipboard.weighty = 0;
gbCClipboard.fill = GridBagConstraints.HORIZONTAL;
gbCClipboard.insets = new Insets(4, 0, 24, 0);
JPanel ClipboardContent = new JPanel();
ClipboardContent.setLayout(gblClipboard);
JScrollPane scrollClipboard = new JScrollPane();
scrollClipboard.setHorizontalScrollBarPolicy(JScrollPane.HORIZONTAL_SCROLLBAR_NEVER);
scrollClipboard.setVerticalScrollBarPolicy(JScrollPane.VERTICAL_SCROLLBAR_ALWAYS);
scrollClipboard.getVerticalScrollBar().setUnitIncrement(16);
scrollClipboard.setBorder(new EmptyBorder(0, 0, 0, 0));
scrollClipboard.setOpaque(true);
scrollClipboard.setViewportView(ClipboardContent);
frame.add(scrollClipboard, BorderLayout.CENTER);
for(int k = 0; k < 16; k++) {
gbCClipboard.gridy = k;
JPanel PANEL = createRecordPanel();
gblClipboard.setConstraints(PANEL, gbCClipboard);
ClipboardContent.add(PANEL);
}
}
private static JPanel createRecordPanel() {
JPanel PANEL = new JPanel();
PANEL.setPreferredSize(new Dimension(0, 70));
PANEL.setLayout(new BorderLayout());
JFXPanel FXPANEL = create("Если навести курсор на данную область с JFXPanel и ScrollPane,"
+ "то прокрутка колесиком мыши работать не будет. На провежутках между панелями прокрутка работет");
PANEL.add(FXPANEL, BorderLayout.CENTER);
return PANEL;
}
//off
static JFXPanel create(String dataText) {
JFXPanel FXPANEL = new JFXPanel();
Platform.setImplicitExit(false);
Platform.runLater(() -> {
WebView webView = new WebView();
webView.setContextMenuEnabled(false);
WebEngine webEngine = webView.getEngine();
webEngine.loadContent(dataText, "text/html");
ScrollPane scrollPane = new ScrollPane();
scrollPane.fitToWidthProperty().set(true);
scrollPane.setHbarPolicy(ScrollBarPolicy.NEVER);
scrollPane.setVbarPolicy(ScrollBarPolicy.NEVER);
scrollPane.setContent(webView);
FXPANEL.setScene(new Scene(scrollPane));
});
return FXPANEL;
}
}
Ответы (1 шт):
Обратите внимание на входящие параметры, вам придется передать ссылку на ваш главный
jScrollPane, надеюсь я всё правильно понял ( переделываю ответ во второй раз :D ) Теперь всё прокручивается вверх и вниз. Изврат конечно... ) Что касается кода, мы передаем входящую дельту скрола из webView в главный jScrollPane, теоретически, скролл пейн от JFX уже даже не нужен, но пробовать я не стал.
static JFXPanel create(String dataText,JScrollPane jScrollPane) {
JFXPanel FXPANEL = new JFXPanel();
Platform.setImplicitExit(false);
Platform.runLater(() -> {
WebView webView = new WebView();
webView.setContextMenuEnabled(false);
WebEngine webEngine = webView.getEngine();
webEngine.loadContent(dataText, "text/html");
ScrollPane scrollPane = new ScrollPane();
scrollPane.fitToWidthProperty().set(true);
webView.setOnScroll(new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent event) {
int y = (int) event.getDeltaY();
System.out.println(y);
if(y<0){
// reverse to DOWN
int y1 = jScrollPane.getVerticalScrollBar().getValue();
jScrollPane.getVerticalScrollBar().setValue(y1+Math.abs(y));
}
if(y>0){
// reverse to UP
int y1 = jScrollPane.getVerticalScrollBar().getValue();
jScrollPane.getVerticalScrollBar().setValue(y1-y-y);
}
}
});
scrollPane.setContent(webView);
FXPANEL.setScene(new Scene(scrollPane));
});
return FXPANEL;
}
frame.setVisible(true); должен быть после цикла