JavaFX使用滑块绘制线对齐

时间:2018-09-28 17:31:03

标签: java video javafx slider

我正在使用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);
            });

但是用滑块没有将线条画在正确的位置。有谁能帮助我解决上述问题? 预先感谢

1 个答案:

答案 0 :(得分:0)

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

首先,Group的工作方式与您不同,我希望它能正常工作,由于某种原因,它总是将Line放在拇指的左侧。

第二,正在计算的x看起来应该可以工作,但是不起作用。在我的测试过程中,使用getWidth()/2大约比我使用的方法少5。但是,我将在下面显示更新的代码

因此,要解决第一个问题,我将Group换成Pane。这样仍然可以让您将(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>

希望这会有所帮助。