Как я могу установить единицу приращения для панели прокрутки в JavaFX?

Класс ScrollBar в JavaFX содержит свойство для установки приращения модуля, и это то, к чему я стремлюсь - однако я не могу найти, как добраться до этого ScrollBar, или установить приращение модуля каким-то другим способом из класса ScrollPane! Я полагаю, что я упускаю что-то очевидное - как мне этого достичь?

2 ответа

Решение

Технически, вы должны быть в состоянии добраться до него, используя .lookup("scrollbar") метод после инициализации скина (если полоса прокрутки видна). Мне не нравится этот ответ, хотя.

Я не думаю, что вы ничего не упустили в соответствии с этим билетом об ошибке:

Я бы посоветовал вам воспользоваться этим, представить свой вариант использования, проголосовать и посмотреть, сможете ли вы получить какой-то ответ в будущем.

Вы можете установить 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 используется в качестве модификатора для ускорения движения.

Другие вопросы по тегам