如何使外部窗格滚动而不是内部窗格

How to make outer pane scroll instead of inner one

首先,正如您可能在标签中注意到的那样,我使用 RichTextFX。 CodeArea只是它的文本区,有一些特点。

我有 ScrollPane 个内部元素:

ScrollPane
|   AnchorPane
|   |   VBox
|   |   |   HBox
|   |   |   |   Label
|   |   |   |   CodeArea
|   |   |   HBox
|   |   |   |   Label
|   |   |   |   CodeArea
|   |   |   HBox
|   |   |   |   Label
|   |   |   |   CodeArea
...........................

当我在光标未悬停时尝试滚动时 CodeAreaScrollPane 滚动就像它应该做的那样。

但是如果我的光标在 CodeArea 上,正如我假设的那样,它会尝试滚动 CodeArea,即使没有任何内容可以滚动(内容很合适)。

ScrollEvent 未在 ScrollPaneAnchorPaneCodeArea 上调用,但 VBox.

我尝试绑定 scrollPane.onScrollProperty().bind(vBox.onScrollProperty())scrollPane.onScrollProperty().bind(codeArea.onScrollProperty()) 等属性,但没有成功。

本题不影响经典TextArea

如何在悬停 CodeArea 时让 ScrollPane 滚动而不是 CodeArea

您也可以使用此示例重现问题:

import javafx.application.Application;
import javafx.scene.Scene;
import javafx.scene.control.Label;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import javafx.scene.control.ScrollPane;
import org.fxmisc.richtext.CodeArea;

public class Main extends Application {

    public static void main(String[] args) {
        launch(args);
    }

    @Override
    public void start(Stage stage) {
        ScrollPane scrollPane = new ScrollPane();
        VBox vBox = new VBox();
        scrollPane.setContent(vBox);
        CodeArea codeArea = new CodeArea();
        codeArea.setPrefHeight(2000);
        Label label = new Label("Can you scroll here while hovering code area?");
        vBox.getChildren().addAll(codeArea, label);
        for (int i = 0; i < 256; i++) {
            codeArea.appendText("Sample text\n");
        }
        Scene scene = new Scene(scrollPane, 400, 400);
        stage.setScene(scene);
        stage.show();
    }
}

在你的例子中做:

codeArea.addEventFilter( ScrollEvent.ANY, scroll -> 
{
    vBox.fireEvent( scroll );
    scroll.consume();
});