反转javafx.scene.control.Slider

反转javafx.scene.control.Slider,java,javafx,Java,Javafx,我需要反转javafx中的滑块 这就是我构建滑块的方式: Slider slide = new Slider(); slide.setPrefHeight(height); slide.setMin(0); slide.setMax(100); slide.setOrientation(javafx.geometry.Orientation.HORIZONTAL); slide.setShowTickLabels(true); slide.setShowTickMarks(true); slid

我需要反转javafx中的滑块

这就是我构建滑块的方式:

Slider slide = new Slider();
slide.setPrefHeight(height);
slide.setMin(0);
slide.setMax(100);
slide.setOrientation(javafx.geometry.Orientation.HORIZONTAL);
slide.setShowTickLabels(true);
slide.setShowTickMarks(true);
slide.setSnapToTicks(true);
此代码创建一个从值0到100的水平对齐滑块。
但我想把它颠倒过来。与中一样,将其水平放置,但显示从100到0的值。而不是0到100


有什么帮助吗?提前感谢。

一种简单的方法是使用自定义标签格式化程序来反转滑块,而不需要实际操作。然后,您只需获取该值并将其还原即可

大概是这样的:

private final DecimalFormat df = new DecimalFormat( "#,##0.00" );
private final double MIN = 0d;
private final double MAX = 100d;

@Override
public void start(Stage primaryStage) {

    VBox vbox=new VBox(20);
    vbox.setPadding(new Insets(20));

    Slider slide = new Slider();
    slide.setPrefSize(300,100);
    slide.setMin(MIN);
    slide.setMax(MAX);
    slide.setOrientation(javafx.geometry.Orientation.HORIZONTAL);
    slide.setShowTickLabels(true);
    slide.setShowTickMarks(true);
    slide.setSnapToTicks(true);
    slide.setLabelFormatter(new StringConverter<Double>(){

        @Override
        public String toString(Double object) {
            return df.format(MAX-object+MIN);
        }

        @Override
        public Double fromString(String string) {
            throw new UnsupportedOperationException("Not supported yet."); 
        }

    });

    Label label = new Label("Value: ");
    slide.valueProperty().addListener((ov,n,n1)->
          label.setText("Value: "+(MAX-n1.doubleValue()+MIN)));
    vbox.getChildren().addAll(slide, label);

    Scene scene = new Scene(vbox, 400, 200);
    primaryStage.setScene(scene);
    primaryStage.show();
}
private final DecimalFormat df=新的DecimalFormat(“0.00”);
专用最终双精度最小值=0d;
私人最终双最大值=100d;
@凌驾
公共无效开始(阶段primaryStage){
VBox VBox=新的VBox(20);
vbox.setPadding(新插图(20));
滑块滑块=新滑块();
幻灯片。设置预览大小(300100);
slide.setMin(最小值);
slide.setMax(最大值);
setOrientation(javafx.geometry.Orientation.HORIZONTAL);
幻灯片。设置显示标签(真);
幻灯片。设置显示勾号(正确);
幻灯片。设置捕捉图标(正确);
slide.setLabelFormatter(新的StringConverter(){
@凌驾
公共字符串toString(双对象){
返回df.格式(最大对象+最小值);
}
@凌驾
public Double fromString(字符串字符串){
抛出新的UnsupportedOperationException(“尚未支持”);
}
});
标签=新标签(“值:”);
slide.valueProperty().addListener((ov,n,n1)->
label.setText(“值:”+(MAX-n1.doubleValue()+MIN));
vbox.getChildren().addAll(幻灯片、标签);
场景=新场景(vbox,400200);
初级阶段。场景(场景);
primaryStage.show();
}

是否有更简短的方法来执行此操作?我不希望创建匿名内部类。这种方法(使用常规的
滑块
控件并修改其外观)需要一个函数来格式化标记的标签,否则它将使用其外观中定义的默认函数。如何传递此函数取决于您(在本例中,内部匿名类是通常的方式),但您可以仅为该自定义格式化程序创建一个类,并传递和实例该类。结果将是相同的,但更多的代码。。。另一种方法是创建新的自定义控件,方法是修改
滑块
控件以反转滑块。我不确定你们是否想去那个里……从-MAX到-MIN进行反向缩放会更容易。所以在LabelFormatter中,你们只需要删除减号。