【发布时间】:2021-06-12 19:30:40
【问题描述】:
我目前正在尝试使用 JavaFX 在 Java 中编写一个简单的应用程序。
在应用程序中,我希望有一个弹出窗口提示用户输入。只要用户不尝试再次打开弹出窗口,这工作正常。 如果他这样做,则会发生以下错误:
Exception in thread "JavaFX Application Thread" java.lang.IllegalArgumentException: Grid hgap=5.0, vgap=0.0, alignment=TOP_LEFTis already set as root of another scene
这是打开窗口的代码:
在主视图控制器中:
btAddChat.setOnAction(e -> lvItems.add(PopUpVC.display()));
在视图控制器中弹出:
public class PopUpVC
{
private static final GridPane root = new GridPane();
private static final TextField tfInput = new TextField();
private static final Button btOK = new Button("OK");
private static String result;
private static Stage primaryStage = new Stage();
public static String display()
{
Scene scene = new Scene(root, 200, 50);
MainVC mvc = new MainVC();
root.setPadding(new Insets(10));
root.setHgap(5);
tfInput.setPrefWidth(scene.getWidth()*0.65);
root.add(btOK, 0, 0, 1, 1);
root.add(tfInput, 1, 0, 1, 1);
btOK.setOnAction(e ->
{
if(!tfInput.getText().equals(""))
{
primaryStage.close();
}
});
primaryStage.setResizable(false);
primaryStage.setScene(scene);
primaryStage.showAndWait();
return tfInput.getText();
}
我只复制了最重要的部分,实际错误要长得多。我知道是什么导致了错误(尝试打开具有相同根目录的窗口会引发错误,因为根目录已在使用中),我只是不知道如何解决它。
这是应用程序的图片:
左上角的按钮打开弹出窗口。
弹出窗口:
如果有关于如何解决此问题的任何建议,我会很高兴听到他们,如果应该有任何其他方式来打开提示用户输入文本的弹出窗口,我也很乐意听说这些!
提前非常感谢!
【问题讨论】:
-
错误信息是不言自明的:
GridPane已经是一个场景的根,而您尝试使其成为另一个场景的根。制作static几乎总是一个错误(或至少是糟糕的设计),但无论哪种方式,GridPane都应该是单个场景的根源。 -
我想通了,真的很简单,我在启动函数中添加了一个参数,所以当我调用它时,我只需给它一个新的 GridPane() 就可以了。
-
也可以考虑使用
TextInputDialog -
@James_D 感谢您的评论,什么时候做一些静态的东西是个好主意,我还在学习,很高兴得到一些建议!
-
"什么时候将某些东西设为静态是个好主意"。几乎从来没有......在工厂模式中
static方法有一些很好的用例,但在除了相当高级的编码风格之外,唯一应该是静态的东西是常量和main()方法。
标签: java exception javafx error-handling