You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

同一Button组件在不同JavaFX场景复用仅显示于场景3的问题

嘿,这个问题我之前也碰到过!核心原因是JavaFX的一个关键规则:任何UI节点(比如你的Button)在同一时刻只能属于一个父容器。

你先把goBack按钮加到了场景2的vB容器里,之后又把它添加到场景3的cartazBox容器。这时候JavaFX会自动把这个按钮从第一个父容器(vB)中移除,再把它放到第二个容器里。所以场景2里的按钮其实已经“消失”了,自然只能在场景3看到它。

解决办法很简单,两种思路任选:

1. 为每个场景创建独立的Button实例

直接给场景2和场景3各做一个返回按钮,它们可以共用相同的点击逻辑:

// 场景2的返回按钮
Button goBackScene2 = new Button("Voltar atrás");
goBackScene2.setOnAction(e -> window.setScene(scene));

// 场景3的返回按钮
Button goBackScene3 = new Button("Voltar atrás");
goBackScene3.setOnAction(e -> window.setScene(scene));

// 把各自的按钮加到对应的VBox里
VBox vB = new VBox(30);
vB.getChildren().addAll(goBackScene2, information);
// ... 场景2的其他代码

VBox cartazBox = new VBox(40);
cartazBox.getChildren().addAll(goBackScene3, Banda1, Banda2, Banda3, Banda4, promo);
// ... 场景3的其他代码

2. 用工厂方法复用按钮逻辑

如果按钮的样式、点击逻辑都一样,写个小方法来批量创建,省得重复代码:

// 封装一个创建返回按钮的工具方法
private Button createGoBackButton(Stage window, Scene targetScene) {
    Button goBack = new Button("Voltar atrás");
    goBack.setOnAction(e -> window.setScene(targetScene));
    // 要是有统一的样式,也可以在这里提前设置好
    return goBack;
}

// 调用方法创建两个按钮
Button goBackScene2 = createGoBackButton(window, scene);
Button goBackScene3 = createGoBackButton(window, scene);

// 分别加到对应的容器里就行
vB.getChildren().addAll(goBackScene2, information);
cartazBox.getChildren().addAll(goBackScene3, Banda1, Banda2, Banda3, Banda4, promo);

从你提供的截图也能看出来,场景2的区域确实没有返回按钮,这完全符合我们上面说的逻辑——按钮已经被转移到场景3的容器里了。记住这个JavaFX的小规则,以后就不会踩同样的坑啦!

内容的提问来源于stack exchange,提问作者franciscoTavares

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.27 06:44:25