Pet*_*r M 6 java javafx javafx-8
嗨,有什么方法可以提高滚动速度。我找到了一些解决方案,但没有一个适合我。那就是我尝试过的:
@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);
}
Run Code Online (Sandbox Code Playgroud)
或者使用CSS:
.scroll-pane .scroll-bar:vertical {
-fx-unit-increment: 10 ;
-fx-block-increment: 50 ;
}
.scroll-pane .scroll-bar:horizontal {
-fx-unit-increment: 5 ;
-fx-block-increment: 20 ;
}
Run Code Online (Sandbox Code Playgroud)
还有其他办法吗?编辑:上面的解决方案都没有工作,我试图使用疯狂的大数字,但滚动速度仍然相同
应用程序应该“更快”地渲染滚动窗格内容,以提高滚动速度。您可以通过减少要渲染的对象数量或/和减少“重绘”方法调用(JFX 中的layoutChildren)数量来实现此目的。据我了解代码片段,您将减少重绘次数,因为更改增量参数可以减少重绘内容的次数。
blockIncrement(如果点击栏的轨道)unitIncrement(如果单击向上、向下、向右、向左按钮)ScrollPane.layoutChildren()当您单击滚动窗格按钮时,将调用该方法。它使 ScrollBar 重置增量 ( ScrollPaneSkin.updateVerticalSB(), ScrollPaneSkin.updateHorizontalSB())。因此,您需要存储以前的增量值并过滤“开箱即用”的滚动事件。
来源:
public class UnitIncrementScrollPaneSkin extends ScrollPaneSkin {
private double prevVerticalBlockIncrement;
private double prevHorizontalBlockIncrement;
private double prevVerticalUnitIncrement;
private double prevHorizontalUnitIncrement;
public UnitIncrementScrollPaneSkin(final ScrollPane scrollPane) {
super(scrollPane);
filterScrollEvents();
}
@Override
protected void layoutChildren(final double x, final double y, final double w, final double h) {
prevVerticalUnitIncrement = getVerticalScrollBar().getUnitIncrement();
prevHorizontalUnitIncrement = getHorizontalScrollBar().getUnitIncrement();
prevVerticalBlockIncrement = getVerticalScrollBar().getBlockIncrement();
prevHorizontalBlockIncrement = getHorizontalScrollBar().getBlockIncrement();
super.layoutChildren(x, y, w, h);
getVerticalScrollBar().setUnitIncrement(prevVerticalUnitIncrement);
getHorizontalScrollBar().setUnitIncrement(prevHorizontalUnitIncrement);
getVerticalScrollBar().setBlockIncrement(prevVerticalBlockIncrement);
getHorizontalScrollBar().setBlockIncrement(prevHorizontalBlockIncrement);
}
private void filterScrollEvents() {
getSkinnable().addEventFilter(ScrollEvent.SCROLL, event -> {
if (event.getDeltaX() < 0) {
getHorizontalScrollBar().increment();
} else if (event.getDeltaX() > 0) {
getHorizontalScrollBar().decrement();
}
if (event.getDeltaY() < 0) {
getVerticalScrollBar().increment();
} else if (event.getDeltaY() > 0) {
getVerticalScrollBar().decrement();
}
event.consume();
});
}
public ScrollBar getVerticalScrollBar() {
return vsb;
}
public ScrollBar getHorizontalScrollBar() {
return hsb;
}
}
Run Code Online (Sandbox Code Playgroud)
用法:
@FXML
public void initialize() {
final double initialInc = 0.2;
UnitIncrementScrollPaneSkin skin = new UnitIncrementScrollPaneSkin(scrollPane);
skin.getVerticalScrollBar().setUnitIncrement(initialInc);
skin.getVerticalScrollBar().setBlockIncrement(initialInc);
skin.getHorizontalScrollBar().setUnitIncrement(initialInc);
skin.getHorizontalScrollBar().setBlockIncrement(initialInc);
scrollPane.setSkin(skin);
}
Run Code Online (Sandbox Code Playgroud)
测试应用程序:
<VBox maxHeight="-Infinity" maxWidth="-Infinity" minHeight="-Infinity" minWidth="-Infinity" prefHeight="226.0" prefWidth="215.0" xmlns="http://javafx.com/javafx/8.0.141" xmlns:fx="http://javafx.com/fxml/1" fx:controller="com.stackoverflow.app.scrollpane.SpeedUpScrollPaneController">
<children>
<ScrollPane fx:id="scrollPane" fitToHeight="true" fitToWidth="true" hbarPolicy="ALWAYS" prefHeight="200.0" prefWidth="200.0" vbarPolicy="ALWAYS">
<content>
<GridPane>
<rowConstraints>
<RowConstraints minHeight="10.0" prefHeight="30.0" vgrow="SOMETIMES" />
</rowConstraints>
</GridPane>
</content>
</ScrollPane>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<Label text="V:" />
<Spinner fx:id="spinnerVertical" prefHeight="25.0" prefWidth="85.0">
<valueFactory>
<SpinnerValueFactory.DoubleSpinnerValueFactory amountToStepBy="0.1" max="1.0" min="0" />
</valueFactory>
</Spinner>
</children>
</HBox>
<HBox alignment="CENTER" prefHeight="100.0" prefWidth="200.0">
<children>
<Label text="H:" />
<Spinner fx:id="spinnerHorizontal" prefHeight="25.0" prefWidth="85.0">
<valueFactory>
<SpinnerValueFactory.DoubleSpinnerValueFactory amountToStepBy="0.1" max="1.0" min="0" />
</valueFactory>
</Spinner>
</children>
</HBox>
<ListView fx:id="listViewLog" prefHeight="200.0" prefWidth="200.0" />
</children>
</VBox>
Run Code Online (Sandbox Code Playgroud)
public class SpeedUpScrollPaneController {
@FXML
private ListView<String> listViewLog;
@FXML
private Spinner<Double> spinnerVertical;
@FXML
private Spinner<Double> spinnerHorizontal;
@FXML
private ScrollPane scrollPane;
@FXML
public void initialize() {
mockScrollPane();
initScrollPane();
}
private void mockScrollPane() {
for (int i = 0; i < 100; i++) {
for (int j = 0; j < 100; j++) {
final Label label = new Label(i + "," + j);
label.setMinWidth(60);
label.setMinHeight(30);
((GridPane) scrollPane.getContent()).add(label, i, j);
}
}
}
private void initScrollPane() {
final UnitIncrementScrollPaneSkin skin = new UnitIncrementScrollPaneSkin(scrollPane);
scrollPane.setSkin(skin);
initIncrement(0.2, spinnerHorizontal, skin.getHorizontalScrollBar());
initIncrement(0.2, spinnerVertical, skin.getVerticalScrollBar());
}
private void initIncrement(final double increment, final Spinner<Double> spinner, final ScrollBar scrollBar) {
scrollBar.unitIncrementProperty().addListener((source, prev, curr) -> {
final String vLog = String.format("%tr: %s unitIncrement=%f", Calendar.getInstance(),
scrollBar.getOrientation(), curr);
listViewLog.getItems().add(vLog);
listViewLog.scrollTo(vLog);
});
scrollBar.blockIncrementProperty().addListener((source, prev, curr) -> {
final String vLog = String.format("%tr: %s blockIncrement=%f", Calendar.getInstance(),
scrollBar.getOrientation(), curr);
listViewLog.getItems().add(vLog);
listViewLog.scrollTo(vLog);
});
spinner.valueProperty().addListener((source, prev, curr) -> {
scrollBar.setUnitIncrement(curr);
scrollBar.setBlockIncrement(curr);
});
Platform.runLater(() -> {
scrollBar.setUnitIncrement(increment);
scrollBar.setBlockIncrement(increment);
spinner.getValueFactory().setValue(scrollBar.getUnitIncrement());
});
}
}
Run Code Online (Sandbox Code Playgroud)
附言。如果您有很多要滚动的对象,您可以尝试以下方法:
ScrollEvent.getDeltaX(), ScrollEvent.getDeltaY())| 归档时间: |
|
| 查看次数: |
227 次 |
| 最近记录: |