#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%. Кроме того, предполагается, что большой палец представляет видимую часть полосы прокрутки. Если некоторые метки находятся в порту просмотра, они должны быть под большим пальцем, это совершенно законно.