同一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
相关产品推荐
相关产品推荐

