我正在使用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);
});
但是用滑块没有将线条画在正确的位置。有谁能帮助我解决上述问题? 预先感谢
答案 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>
希望这会有所帮助。