如何从 scrollPane Javafx 中的滚动条中删除滚动按钮

How do I remove scroll buttons from scroll bar in a scrollPane Javafx

css 文件中的代码:

.scroll-bar .button
{
visibility: hidden;
-fx-background-color: black;
}

但对滚动条按钮没有影响:

请给我提示如何解决这个问题

我看到了一个删除 JavaFX 上下文菜单上的滚动箭头的解决方案,也许这会有所帮助:

.context-menu .scroll-arrow {
 -fx-padding: 0 0 0 0;
}

.context-menu .menu-item {
 -fx-border-style: solid;
 -fx-border-color: transparent;
}

来源:https://gist.github.com/oowekyala/ccc67aa8663e788c072d3824b1c3d22a

我想到了一些似乎可以满足您要求的东西。我绝对不保证它会继续为以后的 JavaFX 版本工作。

我所做的是查看默认的摩德纳风格 sheet。然后尝试删除与滚动条按钮相关的所有填充和插入,有效地使它们不可见,并将首选大小应用于滚动条(因为它们基于按钮的首选大小)。

可能有更有效的方法来处理这个和隐藏东西。也许它可以用更少的规则来完成,但无论如何,这就是我想出的并且它似乎有效。

此外,如果您将滚动窗格设置得非常小,则默认功能是隐藏拇指并允许仅通过按钮在滚动窗格中移动。在您的情况下,按钮不存在,所以不要让滚动窗格变得太小,否则您将失去滚动窗格的平移功能。

无论如何,这是一些示例代码:

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.ScrollPane;
import javafx.scene.layout.VBox;
import javafx.scene.text.Text;
import javafx.stage.Stage;

import java.util.stream.Collectors;
import java.util.stream.IntStream;

public class NoButtonScroll extends Application {

    private static final Lorem lorem = new Lorem();

    private static final String NO_BUTTON_SCROLL_BARS = """
            data:text/css,
            .scroll-bar:vertical {
                -fx-pref-width: 1.12em;
            }
            .scroll-bar:horizontal {
                -fx-pref-height: 1.12em;
            }
            .scroll-pane > .scroll-bar:horizontal > .increment-button,
            .scroll-pane > .scroll-bar:horizontal > .decrement-button {
                -fx-padding: 0 0 0 0;
            }
            .scroll-pane > .scroll-bar:vertical > .increment-button,
            .scroll-pane > .scroll-bar:vertical > .decrement-button {
                -fx-padding: 0 0 0 0;
            }
            .scroll-bar > .increment-button,
            .scroll-bar > .decrement-button {
                -fx-padding: 0 0 0 0;
            }
            .scroll-bar:horizontal > .increment-button,
            .scroll-bar:horizontal > .decrement-button {
                -fx-background-insets: 0 0 0 0 , 0 0 0 0, 0 0 0 0, 0 0 0 0 0;
            }
            .scroll-bar:vertical > .increment-button,
            .scroll-bar:vertical > .decrement-button {
                -fx-background-insets: 0 0 0 0, 0 0 0 0, 0 0 0 0;
            }
            .scroll-bar:horizontal > .decrement-button > .decrement-arrow {
                -fx-padding: 0 0 0 0;
            }
            .scroll-bar:horizontal > .increment-button > .increment-arrow {
                -fx-padding: 0 0 0 0;
            }
            .scroll-bar:vertical > .decrement-button > .decrement-arrow {
                -fx-padding: 0 0 0 0;
            }
            .scroll-bar:vertical > .increment-button > .increment-arrow {
                -fx-padding: 0 0 0 0;
            }
            """;

     @Override public void start(Stage stage) {
         ScrollPane standardScrollPane = new ScrollPane(generateText());
         ScrollPane noButtonScrollPane = new ScrollPane(generateText());
         noButtonScrollPane.getStylesheets().add(NO_BUTTON_SCROLL_BARS);

         final VBox layout = new VBox(10, standardScrollPane, noButtonScrollPane);
         layout.setPadding(new Insets(10));
         layout.setPrefSize(600, 400);

         stage.setScene(new Scene(layout));
         stage.show();
    }

    private Text generateText() {
        Text sampleText = new Text(lorem.nextText(500));
        sampleText.setWrappingWidth(800);

        return sampleText;
    }

    // class for generating example text for test data, not integral to the solution.
    private static final class Lorem {
        private static final String[] lorem = "lorem ipsum dolor sit amet consectetur adipiscing elit sed do eiusmod tempor incididunt ut labore et dolore magna aliqua".split(" ");
        private int idx = 0;

        public String nextWord() {
            return lorem[getAndIncrementIdx()];
        }

        public String nextText(int nWords) {
            return IntStream.range(0, nWords)
                    .mapToObj(i -> nextWord())
                    .collect(Collectors.joining(" "));
        }

        private int getAndIncrementIdx() {
            int retVal = idx;

            idx = (idx + 1) % lorem.length;

            return retVal;
        }
    }

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

}