Как я могу установить единицу приращения для панели прокрутки в JavaFX?
Класс ScrollBar в JavaFX содержит свойство для установки приращения модуля, и это то, к чему я стремлюсь - однако я не могу найти, как добраться до этого ScrollBar, или установить приращение модуля каким-то другим способом из класса ScrollPane! Я полагаю, что я упускаю что-то очевидное - как мне этого достичь?
2 ответа
Технически, вы должны быть в состоянии добраться до него, используя .lookup("scrollbar")
метод после инициализации скина (если полоса прокрутки видна). Мне не нравится этот ответ, хотя.
Я не думаю, что вы ничего не упустили в соответствии с этим билетом об ошибке:
- Как получить доступ к компоненту ScrollBar в элементе управления ScrollPane?
https://bugs.openjdk.java.net/browse/JDK-8091864
Я бы посоветовал вам воспользоваться этим, представить свой вариант использования, проголосовать и посмотреть, сможете ли вы получить какой-то ответ в будущем.
Вы можете установить ScrollEventListener для ScrollPane и, таким образом, переопределить исходное поведение. Таким образом, например, я реализовал ScrollPane, который прокручивает горизонтально, а не вертикально. Вот как выглядит соответствующая часть моего кода:
public class Overview extends ScrollPane {
...
private void setupHorizontalScrolling() {
this.setOnScroll(new EventHandler<ScrollEvent>() {
@Override
public void handle(ScrollEvent scrollEvent) {
double deltaY = scrollEvent.getDeltaY()*2; // *2 to make the scrolling a bit faster
double width = Overview.this.getContent().getBoundsInLocal().getWidth();
double hvalue = Overview.this.getHvalue();
Overview.this.setHvalue(hvalue + -deltaY/width); // deltaY/width to make the scrolling equally fast regardless of the actual width of the component
}
});
}
...
}
Чтобы удовлетворить ваши требования, вы можете просто изменить строку, в которой вызывается get / setHvalue, на get / setVvalue, а затем вы можете настроить прокрутку так, как хотите.
То, что я в конечном итоге использовал:
@FXML
private ScrollPane scrollPane;
@FXML
public void initialize() {
Platform.runLater(() -> setFasterScroller(scrollPane));
}
private static void setFasterScroller(ScrollPane scrollPane) {
ScrollBar verticalScrollbar = (ScrollBar) scrollPane.lookup(".scroll-bar:vertical");
double defaultUnitIncrement = verticalScrollbar.getUnitIncrement();
verticalScrollbar.setUnitIncrement(defaultUnitIncrement * 3);
}
Этот изменяет скорость вертикальной прокрутки, что вы хотели бы делать чаще, но ее можно изменить на .scrollbar:horizontal
также. 3
используется в качестве модификатора для ускорения движения.