首页 > 解决方案 > JavaFX用滑块绘制线对齐

问题描述

我正在使用 JavaFx MediaPlayer 播放具有滑块作为时间线的视频文件。我想绘制与单击时间轴上任意点的点对齐的线。为此,我使用了以下代码:

在 FXMLDocument.fxml

<VBox prefHeight="126.0" prefWidth="600.0">
                     <children>
                        <Slider fx:id="timeSlider" maxWidth="1.7976931348623157E308" prefHeight="14.0" prefWidth="600.0" />
                        <Group fx:id="group" />
                     </children>
                  </VBox>

在 FXMLDocumentController.java 中

timeSlider.setOnMousePressed(e -> {
                StackPane p = (StackPane)timeSlider.lookup(".thumb");
                double x = p.getLayoutX() +( p.getWidth() /2);
                Line line = new Line(x,0,x,100);
                line.setFill(Color.RED);
                line.setStroke(Color.RED);
                line.getStyleClass().clear();
                line.getStyleClass().add("multi_graph_scribe");
                group.getChildren().add(line);

                if(!line.isVisible())
                    line.setVisible(true);
            });

但是该线没有用滑块拇指绘制在正确的位置。有人可以帮我解决上述问题吗?提前致谢

标签: javavideojavafxslider

解决方案


所以我发现有两件事让你失望。

首先,Group它没有按照您和我预期的方式工作,由于某种原因,它总是将 放在Line拇指的左侧。

其次,x正在计算的东西看起来应该可以工作,但事实并非如此。在我的测试中getWidth()/2,使用我使用的方法大约是 5 次,但我将在下面显示更新的代码

所以为了解决第一个问题,我换成GroupPane. 这仍然允许您将物品放在(x,y)任何需要的地方。

为了解决定位问题,我将表达式更改为

double x = p.getBoundsInParent().getMinX() + ((p.getBoundsInParent().getMaxX()-p.getBoundsInParent().getMinX())/2);

正如你所看到的,它没有使用拇指的宽度,而是使用了它的有界宽度,这是不同的。

这导致了以下代码。

timeSlider.setOnMousePressed(e -> {
    StackPane p = (StackPane)timeSlider.lookup(".thumb");
    System.out.println(p.getBoundsInParent().getMinX() + " " + p.getBoundsInParent().getMaxX() + " " + p.getWidth());
    double x = p.getBoundsInParent().getMinX() + ((p.getBoundsInParent().getMaxX()-p.getBoundsInParent().getMinX())/2);
    System.out.println(x);
    Line line = new Line(x,0,x,100);
    line.setFill(Color.RED);
    line.setStroke(Color.RED);
    line.getStyleClass().clear();
    group.getChildren().add(line);
    System.out.println(line.getBoundsInParent());

    if(!line.isVisible())
        line.setVisible(true);
});

<VBox prefHeight="126.0" prefWidth="600.0">
    <children>
        <Slider fx:id="timeSlider" maxWidth="1.7976931348623157E308" prefHeight="14.0" prefWidth="600.0" />
        <Pane fx:id="group" />
    </children>
</VBox>

希望这可以帮助。


推荐阅读