gpt4 book ai didi

JavaFX - 水平选取框文本

转载 作者:太空宇宙 更新时间:2023-11-04 14:51:52 25 4
gpt4 key购买 nike

我正在尝试实现类似于 marquee 的效果- 沿水平轴移动的长文本行(在我的例子中)。我设法让它工作,但我不能称其令人满意。

我的 Controller 类如下所示:

@FXML
private Text newsFeedText;

(...)
@Override
public void initialize(URL url, ResourceBundle resourceBundle) {
TranslateTransition transition = TranslateTransitionBuilder.create()
.duration(new Duration(7500))
.node(newsFeedText)
.interpolator(Interpolator.LINEAR)
.cycleCount(Timeline.INDEFINITE)
.build();

GraphicsDevice gd = GraphicsEnvironment.getLocalGraphicsEnvironment().getDefaultScreenDevice();
int width = gd.getDisplayMode().getWidth();

transition.setFromX(width);
transition.setToX(-width);
transition.play();
}

newsFeedText 绑定(bind)到一些动态更新的文本源,因此它包含不同数量的文本。

我的代码至少有两个缺点:

  • -width过渡到+widthwidth 是显示器的分辨率宽度

如果窗口未全屏,有时文本将根本不可见。如果文本更长并且 newsFeedText 宽度将大于显示器的分辨率宽度,则过渡将消失“一半”(仍然在屏幕上)。

  • 目前,Duration 不依赖于 newsFeedText 的宽度。

现在,这没什么了不起的,但是如果transition的fromXtoX是动态计算的,那么它会导致跑马灯的不同速度。

如何摆脱这些缺点?

最佳答案

我已经设法让它工作,任何重新计算只有在转换停止后才会发生,因此我们无法将其cycleCount设置为Timeline.INDEFINITE。我的要求是我可以更改组件内的文本,以便有 fxml 接线:

@FXML
private Text node; // text to marquee

@FXML
private Pane parentPane; // pane on which text is placed

有效的代码是:

transition = TranslateTransitionBuilder.create()
.duration(new Duration(10))
.node(node)
.interpolator(Interpolator.LINEAR)
.cycleCount(1)
.build();

transition.setOnFinished(new EventHandler<ActionEvent>() {
@Override
public void handle(ActionEvent actionEvent) {
rerunAnimation();
}
});

rerunAnimation();

其中rerunAnimation()是:

private void rerunAnimation() {
transition.stop();
// if needed set different text on "node"
recalculateTransition();
transition.playFromStart();
}

recalculateTransition()是:

private void recalculateTransition() {
transition.setToX(node.getBoundsInLocal().getMaxX() * -1 - 100);
transition.setFromX(parentPane.widthProperty().get() + 100);

double distance = parentPane.widthProperty().get() + 2 * node.getBoundsInLocal().getMaxX();
transition.setDuration(new Duration(distance / SPEED_FACTOR));
}

关于JavaFX - 水平选取框文本,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23668382/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com