setOrientation设置为Orientation.HORIZONTAL时,滑块的移动非常平滑,但当setOrientation设置为Orientation.VERTICAL时,移动是滞后的.

以下是最低限度的复制:

package org.example;

import javafx.application.Application;
import javafx.geometry.Orientation;
import javafx.geometry.Pos;
import javafx.scene.Scene;
import javafx.scene.layout.FlowPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox;
import javafx.stage.Stage;
import org.controlsfx.control.RangeSlider;

public class App extends Application {

    @Override
    public void start(Stage stage) {

        RangeSlider rangeSliderVertical = new RangeSlider();
        rangeSliderVertical.setOrientation(Orientation.VERTICAL);
        rangeSliderVertical.setMinHeight(500);
        rangeSliderVertical.setMax(100);
        rangeSliderVertical.setMin(0);
        rangeSliderVertical.setHighValue(100);
        rangeSliderVertical.setLowValue(0);

        RangeSlider rangeSliderHorizontal = new RangeSlider();
        rangeSliderHorizontal.setMinWidth(500);
        rangeSliderHorizontal.setMax(100);
        rangeSliderHorizontal.setMin(0);
        rangeSliderHorizontal.setHighValue(100);
        rangeSliderHorizontal.setLowValue(0);
        rangeSliderHorizontal.setOrientation(Orientation.HORIZONTAL);

        FlowPane vBoxWithSliders = new FlowPane();
        VBox.setVgrow(vBoxWithSliders, Priority.ALWAYS);
        HBox.setHgrow(vBoxWithSliders, Priority.ALWAYS);

        vBoxWithSliders.setAlignment(Pos.CENTER);
        vBoxWithSliders.getChildren().addAll(rangeSliderVertical, rangeSliderHorizontal);

        var scene = new Scene(vBoxWithSliders, 600, 600);
        stage.setScene(scene);
        stage.show();
    }

    public static void main(String[] args) {
        launch();
    }

}

当RangeSlider垂直时,如何实现流畅的移动有什么建议吗?

enter image description here

推荐答案

这是RangeSliderSkin分中的一个错误.现有代码包括lowValueProperty()highValueProperty()上的以下监听程序:

    registerChangeListener(rangeSlider.lowValueProperty(), e -> {
        positionLowThumb();
        rangeBar.resizeRelocate(rangeStart, rangeBar.getLayoutY(), 
        rangeEnd - rangeStart, rangeBar.getHeight());
    });
    registerChangeListener(rangeSlider.highValueProperty(), e -> {
        positionHighThumb();
        rangeBar.resize(rangeEnd-rangeStart, rangeBar.getHeight());
    });

请参阅https://github.com/controlsfx/controlsfx/blob/master/controlsfx/src/main/java/impl/org/controlsfx/skin/RangeSliderSkin.java处的源代码

rangeBar.resizeRelocate()rangeBar.resize()的调用假定范围滑块具有水平方向.(您可以看到这一点,因为只有栏的layoutX和/或width可以更改.layoutYheight都被设置为它们的当前值.)在layoutChildren()方法中重新绘制范围条本身之前,纠正范围条的不正确布局.然而,我认为在某些情况下,可以在调用layoutChildren()之前处理额外的拖动事件,从而导致对拇指位置的错误计算.

我有一个版本为https://github.com/james-d/controlsfx/tree/master的ControlsFX存储库分支,它用

    registerChangeListener(rangeSlider.lowValueProperty(), e -> {
        positionLowThumb();
        if (isHorizontal()) {
            rangeBar.resizeRelocate(rangeStart, rangeBar.getLayoutY(),
                    rangeEnd - rangeStart, rangeBar.getHeight());
        } else {
            rangeBar.resize(rangeBar.getWidth(), rangeEnd - rangeStart);
        }
    });
    registerChangeListener(rangeSlider.highValueProperty(), e -> {
        positionHighThumb();
        if (isHorizontal()) {
            rangeBar.resize(rangeEnd - rangeStart, rangeBar.getHeight());
        } else {
            rangeBar.resizeRelocate(rangeBar.getLayoutX(), rangeStart,
                    rangeBar.getWidth(), rangeEnd - rangeStart);
        }
    });

并提交了Issue 1521分,以及pull request分.

作为临时措施,您可以随意克隆和构建我的Forking ,直到(并且除非)拉请求被接受.

Java相关问答推荐

尽管类型擦除,instanceof与泛型在Java中如何工作?

Java模式匹配记录

连接Quarkus中的两个异步操作

在bash中将数组作为Java程序的参数传递

SpringBoot+Java 17@Valid未验证POJO

为什么我的在一个范围内寻找素数的程序不能像S所期望的那样工作

搜索列表返回多个频道

Docker不支持弹性APM服务器

声明带有泛型的函数以用作查找映射中的值

Kotlin Val是否提供了与Java最终版相同的可见性保证?

当b是一个字节并且在Java中值为-1时,为什么b>;>;>;1总是等于-1?

Android应用程序为错误的显示类型 Select 尺寸文件

深度优先搜索实现:算法只向右搜索

在JDK Flight Recorder中只记录单个线程

在Oracle中调用输出参数在索引处缺少IN或OUT参数的函数

JPA无手术同品种器械可能吗?

java.lang.NoSuchMethodError:';org.apache.commons.io.output.UnsynchronizedByteArrayOutputStream$Builder org.apache.poi-poi-ooxml-5.2.4

无泄漏函数的Java DRY

移动二维数组的行

在java中使用SevenZip.openArchive方法后无法删除文件