【问题标题】:How to create non-regular ticks for a JavaFx slider如何为 JavaFx 滑块创建非常规刻度
【发布时间】:2021-08-04 04:45:42
【问题描述】:

我想在我的滑块上设置特定的刻度。 例如:

[---¦---¦-----------¦------O-¦--]

  • [-----]:滑块
  • ¦:滴答声
  • O : 光标

目的是创建一个我们可以看到亮点的时间线。

【问题讨论】:

  • 标准 FX 滑块不支持。你必须创建自己的,或者找到一个图书馆。
  • 您有多种选择,但主要的两种选择是,1) 您需要创建自己的滑块实现来添加此功能,或者 2) 您可以在顶部放置标签/按钮看起来像您的刻度的滑块,您可以使用事件来计算光标何时位于刻度上并相应地执行您的操作。

标签: java user-interface javafx slider timeline


【解决方案1】:

您可以编写自己的小部件以将刻度放在滑块上。唯一棘手的一点是确保将滑块的 setPickOnBounds() 设置为 false。还将刻度放入 VBox,然后将 VBox 的 setPickOnBounds() 设置为 true 可以更轻松地单击刻度:

public class SliderSample extends Application {

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

    private static Image arrowImage = new Image("https://www.shareicon.net/data/12x12/2015/09/01/94166_arrow_512x512.png");

    @Override
    public void start(Stage primaryStage) {
        Scene scene = new Scene(new SliderWithTicks(), 300, 300);
        primaryStage.setScene(scene);
        primaryStage.show();
    }

    class SliderWithTicks extends Pane {

        private Slider slider = new Slider(0, 100, 30);

        SliderWithTicks() {
            getChildren().addAll(new Tick(80), new Tick(20), new Tick(30), slider);
            slider.minWidthProperty().bind(widthProperty());
            slider.setPickOnBounds(false);
        }

        class Tick extends VBox {
            Tick(int value) {
                getChildren().add(new ImageView(arrowImage));
                setPickOnBounds(true);
                setOnMouseClicked(evt -> slider.adjustValue(value));
                translateXProperty().bind((slider.widthProperty().subtract(16)).multiply(value / slider.getMax()).add(2));
                translateYProperty().set(12);
            }
        }
    }
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-12-23
    • 2012-08-15
    相关资源
    最近更新 更多