Существует панель прокрутки JAVAFX, которая содержит древовидную структуру. Внутри дерева у меня есть несколько vbox. Их высота может измениться. Во-первых, возникла проблема: когда я перемещал vbox благодаря операции перетаскивания, полоса прокрутки, принадлежащая области прокрутки, не хотела перемещаться. Чтобы решить эту проблему, я провел здесь несколько исследований. Я нашел решение. Код ниже
private ScrollBar getVerticalScrollbar() {
ScrollBar result = null;
for (Node n : scrollPane.lookupAll(".scroll-bar")) {
if (n instanceof ScrollBar) {
ScrollBar sb = (ScrollBar) n;
if (sb.getOrientation().equals(Orientation.VERTICAL)) {
result = sb;
}
}
}
return result;
}
private void dragScroll() {
ScrollBar sb = getVerticalScrollbar();
if (sb != null && !dropped) {
double newValue = sb.getValue() + scrollVelocity;
newValue = Math.min(newValue, 1.0);
newValue = Math.max(newValue, 0.0);
sb.setValue(newValue);
}
}
public void setupScrolling() {
scrolltimeline.setCycleCount(Timeline.INDEFINITE);
scrolltimeline.getKeyFrames().add(new KeyFrame(Duration.millis(15), (ActionEvent) -> {
dragScroll();
}));
scrollPane.setOnDragExited((DragEvent event) -> {
if (event.getY() > 0) {
scrollVelocity = 1.0 / 100;
} else {
scrollVelocity = -1.0 / 100;
}
if (!dropped) {
scrolltimeline.play();
} else {
scrolltimeline.stop();
}
});
scrollPane.setFitToHeight(true);
scrollPane.setOnDragEntered(event -> {
scrolltimeline.stop();
dropped = false;
});
scrollPane.setOnDragDone(event -> {
scrolltimeline.stop();
});
scrollPane.setOnMouseReleased(event -> {
scrolltimeline.stop();
});
scrollPane.setOnDragDropped((DragEvent event) -> {
dropped = true;
scrolltimeline.stop();
event.setDropCompleted(true);
});
scrollPane.setOnDragOver((DragEvent event) -> {
event.acceptTransferModes(TransferMode.MOVE);
});
scrollPane.setOnScroll((ScrollEvent event) -> {
scrolltimeline.stop();
});
}
setupScrolling вызывается в методе, который устанавливает контроллер.
Тем не менее, вы должны быть удивлены: где осуществляется операция перетаскивания vbox? Существует другой интерфейс перетаскивания, который создается, и значение отброшенной переменной изменяется на true в метод dragDropped. Это позволяет остановить используемую временную шкалу (функция временной шкалы заключается в перемещении полосы прокрутки путем изменения значения полосы прокрутки).
private final void onLabelDragDropped(DragEvent event) {
...
dropped = true;
scrolltimeline.stop()
...
};
Теперь мы подошли к текущей проблеме. Когда метка перемещается над VBOX (есть несколько VBOX, которые содержат метки), размер VBOX изменяется. Это сделано благодаря коду css: «-fx-padding: 10 10 10 10». Однако полоса прокрутки не имеет своего размера, который изменяется. Таким образом, когда полоса прокрутки уменьшается во время операции перетаскивания, ее размер не обновляется автоматически. Таким образом, некоторые VBox больше не видны. На самом деле они ниже.
Спасибо за вашу помощь.
сердечный привет,
VinzFR
PS: извините, я не очень хорошо говорю по-английски