7

我刚开始学习 Javafx,到目前为止我真的很喜欢它。但是,在我当前的项目中,我需要使用文本作为 javafx 滑块的刻度标签。我用谷歌搜索了很多,但找不到任何帮助。因此,例如,我想要一个有 4-5 个位置的滑块,它们是“坏”、“好”等,而不是 1、2、3、...

我知道我可以手动构建自定义 UI,并将标签放置在正确的位置,但我需要生成带有自定义文本的滑块,并且每次都具有不同的长度,所以它不起作用。例如,在摇摆中,可以使用哈希表更改标签,所以我的问题是,是否可以在 Javafx 中做到这一点?

4

1 回答 1

10

这是使用slider.setLabelFormatter的示例。

滑块快照

import javafx.application.Application;
import javafx.geometry.Insets;
import javafx.scene.Scene;
import javafx.scene.control.Slider;
import javafx.scene.layout.HBox;
import javafx.stage.Stage;
import javafx.util.StringConverter;

public class SlidingScale extends Application {

    @Override
    public void start(Stage primaryStage) throws Exception{
        Slider slider = new Slider(0, 3, 0);
        slider.setMin(0);
        slider.setMax(3);
        slider.setValue(1);
        slider.setMinorTickCount(0);
        slider.setMajorTickUnit(1);
        slider.setSnapToTicks(true);
        slider.setShowTickMarks(true);
        slider.setShowTickLabels(true);

        slider.setLabelFormatter(new StringConverter<Double>() {
            @Override
            public String toString(Double n) {
                if (n < 0.5) return "Novice";
                if (n < 1.5) return "Intermediate";
                if (n < 2.5) return "Advanced";

                return "Expert";
            }

            @Override
            public Double fromString(String s) {
                switch (s) {
                    case "Novice":
                        return 0d;
                    case "Intermediate":
                        return 1d;
                    case "Advanced":
                        return 2d;
                    case "Expert":
                        return 3d;

                    default:
                        return 3d;
                }
            }
        });

        slider.setMinWidth(380);

        HBox layout = new HBox(slider);
        layout.setPadding(new Insets(30));

        primaryStage.setScene(new Scene(layout));
        primaryStage.show();
    }


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

由于JavaFX 2.2 中的错误,上面的示例仅适用于Java 8

当您使滑块变小时,一些标签会消失,所以我在滑块上设置了一个最小宽度,以便标签保留(另一种解决方案,可能是设置一个新的标签格式化程序,如果滑块尺寸较小,则使用缩写标签)。

您可能还对以下功能请求投票或评论感兴趣:RT-27863 A LabelFormatter 不足以自定义 Slider ticks

于 2013-08-27T07:50:01.847 回答