Как ставить метки на полосе прокрутки

#javafx #scrollbar #javafx-8

#javafx #полоса прокрутки #javafx-8

Вопрос:

Я реализую функцию поиска, и я хотел бы выделить позиции совпадений на полосе прокрутки моего табличного представления.

Есть ли какой-нибудь способ показать цветовые метки на полосе прокрутки в JavaFX?

Комментарии:

1. Разве не было бы проще сделать, например, то, что делает Eclipse? Т.е. Иметь вертикальную полосу справа от полосы прокрутки, где вы ставите метки / выделения (ошибки / предупреждения в Eclipse).

2. @Джонатан, это действительно может быть вариантом. Я уже некоторое время использую intellij и забыл способ eclipse. Жаль, что я не могу найти какой-либо встроенный способ показать их непосредственно на полосе прокрутки

Ответ №1:

Если вы получаете доступ к файлу ScrollBar после его первого размещения, вы можете добавить метки к дорожке:

 public class ScrollBarMark {

    private final Rectangle rect;
    private final DoubleProperty position = new SimpleDoubleProperty();

    public ScrollBarMark() {
        rect = new Rectangle(5, 5, Color.RED.deriveColor(0, 1, 1, 0.5));
        rect.setManaged(false);
    }

    public void attach(ScrollBar scrollBar) {
        StackPane sp = (StackPane) scrollBar.lookup(".track");
        rect.widthProperty().bind(sp.widthProperty());
        sp.getChildren().add(rect);
        rect.layoutYProperty().bind(Bindings.createDoubleBinding(() -> {
            double height = sp.getLayoutBounds().getHeight();
            double visibleAmout = scrollBar.getVisibleAmount();
            double max = scrollBar.getMax();
            double min = scrollBar.getMin();
            double pos = position.get();
            double delta = max - min;

            height *= 1 - visibleAmout / delta;

            return height * (pos - min) / delta;
        },
                position,
                sp.layoutBoundsProperty(),
                scrollBar.visibleAmountProperty(),
                scrollBar.minProperty(),
                scrollBar.maxProperty()));
    }

    public final double getPosition() {
        return this.position.get();
    }

    public final void setPosition(double value) {
        this.position.set(value);
    }

    public final DoubleProperty positionProperty() {
        return this.position;
    }

    public void detach() {
        StackPane parent = (StackPane) rect.getParent();
        if (parent != null) {
            parent.getChildren().remove(rect);
            rect.layoutYProperty().unbind();
            rect.widthProperty().unbind();
        }
    }

}
  

Сейчас это работает только с вертикальными ScrollBar s.

 @Override
public void start(Stage primaryStage) {
    ScrollBar scrollBar = new ScrollBar();
    scrollBar.setOrientation(Orientation.VERTICAL);

    scrollBar.setMax(100);
    scrollBar.setVisibleAmount(50);
    scrollBar.valueProperty().addListener((a,b,c) -> System.out.println(c));

    StackPane root = new StackPane();
    root.getChildren().add(scrollBar);

    Scene scene = new Scene(root, 200, 500);

    // do layout
    root.applyCss();
    root.layout();

    ScrollBarMark mark1 = new ScrollBarMark();
    ScrollBarMark mark2 = new ScrollBarMark();
    mark1.attach(scrollBar);
    mark2.attach(scrollBar);
    mark1.setPosition(50);
    mark2.setPosition(75);

    primaryStage.setScene(scene);
    primaryStage.show();
}
  

Комментарии:

1. Вау, это выглядит превосходно. Я не могу протестировать это прямо сейчас, но я дам вам знать, как это прошло.

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

3. Кстати, почему height *= 1 - visibleAmout / delta ?

4. @Joffrey Вы не можете перемещать верхнюю часть большого пальца по всей длине a ScrollBar , поскольку нижняя часть большого пальца не может быть перемещена ниже нижней части дорожки. Поэтому вам нужно убрать эту часть из общей высоты, доступной в качестве позиций для верхней части большого пальца.

5. С метками так не работает. Представьте, что ваше переполнение составляет всего несколько строк. У вас есть большой палец, занимающий около 90% полосы прокрутки. Я не хочу, чтобы метки ограничивались оставшимися 10%. Кроме того, предполагается, что большой палец представляет видимую часть полосы прокрутки. Если некоторые метки находятся в порту просмотра, они должны быть под большим пальцем, это совершенно законно.