0

Sliderユーザーがその値に関連付けられたオブジェクトの特定の特性をマークできるようにするために、JavaFXアプリにもを含むグループにパスを追加しようとしていSliderます。ただし、パス(この場合は垂直線)は正確に正しい位置にマークされていません。小さい値の場合は親指の前にあり、大きい値の場合は親指の後にあります。

double pixelsPerValue = slider.getWidth() / (slider.getMax() - slider.getMin());
double leftAdjust = slider.getLayoutX();
double pathX = leftAdjust + (slider.getValue() * pixelsPerValue);
Path path = PathBuilder.create()
    .elements(
        new MoveTo(pathX, 0)
        , new LineTo(pathX, 25)
        )
    .stroke(Color.CYAN)
    .strokeWidth(3)
    .translateX(0)
    .translateY(27.0)
    .build();

2つのことに注意してください。

  1. グループは、BorderPaneの下部にあるHBoxにあります。
  2. スライダーの最大値は、ユーザーがスクロールしたいオブジェクトの数によって決まります。たとえば、8,617、10,492、6,345などです。

なぜこれが起こっているのか考えていますか?そして、どうすればそれを修正できますか?

4

2 に答える 2

2

いくつかのメモ;

  1. 描いた線がわずかにずれているのは、境界線とスライダーのスライダーラインの間の左右の余白が原因です。double margin以下のコードの値を変更することでテストできます。
  2. slider.getWidth()ステージが表示されるまで使用できません。以下のコードの「前」と「後」の印刷を参照してください。代わりにを使用しslider.getPrefWidth()ました。もちろん、イベントハンドラーでgetWidth()を使用している場合は、問題ありません。
  3. より簡単な制御とコーディングのためにバインディングを使用してください。以下のコードで親指をスライドさせます。

パブリッククラスSliderDemoはApplication{を拡張します

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

    @Override
    public void start(Stage primaryStage) {

        Slider slider = new Slider();
        slider.setStyle("-fx-border-color: green");
        slider.setLayoutX(60);
        slider.setLayoutY(50);
        slider.setMax(200);
        slider.setValue(180);
        slider.setMin(100);
        slider.setPrefWidth(390);

        double margin = 10; // left and right margins between the border and the slider line of the slider

        SimpleDoubleProperty pixelsPerValueProperty = //
                new SimpleDoubleProperty((slider.getPrefWidth() //
                - (2 * margin)) / (slider.getMax() - slider.getMin()));

        SimpleDoubleProperty pathXProperty = new SimpleDoubleProperty();
        pathXProperty.bind(slider.layoutXProperty()//
                .add(margin)//
                .add(pixelsPerValueProperty.multiply(slider.valueProperty().subtract(slider.getMin()))));

        MoveTo moveTo = new MoveTo(0, 0);
        moveTo.xProperty().bind(pathXProperty);
        LineTo lineTo = new LineTo(0, 25);
        lineTo.xProperty().bind(pathXProperty);

        Path path = PathBuilder.create().elements(
                moveTo, lineTo)//
                .stroke(Color.CYAN)//
                .strokeWidth(3)//
                .translateX(0)//
                .translateY(77.0)//
                .build();

        Group group = new Group(slider, path);
        primaryStage.setScene(new Scene(group, 700, 250));
        System.out.println("before slider.getWidth() = " + slider.getWidth());
        primaryStage.show();
        System.out.println("after slider.getWidth() = " + slider.getWidth());
    }
}
于 2012-07-24T10:09:36.403 に答える
0
private void addMarker() {

       double margin = 7; // left and right margins between the border and the slider line of the slider

        SimpleDoubleProperty pixelsPerValueProperty = new SimpleDoubleProperty( //
                (slider.getPrefWidth() - (2 * margin)) / (slider.getMax() - slider.getMin())); // need preferred width even though called from keystroke handler

        SimpleDoubleProperty pathXProperty = new SimpleDoubleProperty();
        pathXProperty.bind(slider.layoutXProperty()//
                .add(margin)//
                .add(pixelsPerValueProperty.multiply(slider.valueProperty().subtract(slider.getMin())))//
        );

        double currentValue = pathXProperty.doubleValue(); 
        MoveTo moveTo = new MoveTo(0, 0);
        moveTo.setX(currentValue);
        LineTo lineTo = new LineTo(0, 25);
        lineTo.setX(currentValue);

        Path myTick = PathBuilder.create()
            .elements(
                moveTo
                , lineTo
                )
            .stroke(Color.CYAN)
            .strokeWidth(3)
            .translateX(0)     // for path instantiated in FXML = 7.0
            .translateY(27.0)
            .managed(true)
            .build();

        pathGroup.getChildren().add(myTick);

}
于 2012-07-25T19:57:15.603 に答える