如何将标签迭代添加到 JavaFX 中的 GridPane?
How can labels be iteratively added to a GridPane in JavaFX?
我正在尝试使用 for 循环将标签迭代添加到 JavaFX 中的 GridPane,但是当我尝试启动应用程序时,我总是遇到错误。控制台输出为:
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=10.0, vgap=10.0, alignment=TOP_CENTER
at javafx.scene.Parent.onProposedChange(Parent.java:454)
at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
at javafx.scene.layout.GridPane.add(GridPane.java:965)
at com.comsci.drt.ProjectGUI.start(ProjectGUI.java:181)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null(GtkApplication.java:139)
我是这方面的初学者,但我知道它告诉我我正在尝试放置一个已经放置的对象。
代码:
Label l = new Label();
for(int i = 2; i <= 3; i++) {
l.setText(finalResultsArray[i].getTeamName()); <-- line 181
pane1.add(l, 0, i);
}
然后我继续使用一组标签,我相信这些标签不会尝试替换已经放置的对象,但我收到另一个错误:
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at com.comsci.drt.ProjectGUI.start(ProjectGUI.java:175)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null(GtkApplication.java:139)
代码:
Label[] label = new Label[12];
for(int i = 0; i < 12; i++) {
for(int j = 0; j < 1; j++) {
label[i].setText(finalResultsArray[i].getTeamName());
pane1.add(label[i], 0, i);
}
}
您需要为每个标签调用一个构造函数。对于您的第一个片段,只需将 "new Label" 调用移动到循环内。
每次要向网格添加文本时都需要使用新的 Label
实例。此外,新创建的数组填充了 null
个值。
因此,使这项工作可行的方法是
for(int i = 2; i <= 3; i++) {
Label l = new Label();
l.setText(finalResultsArray[i].getTeamName());
pane1.add(l, 0, i);
}
或
Label[] label = new Label[12];
for(int i = 0; i < 12; i++) {
label[i] = new Label();
label[i].setText(finalResultsArray[i].getTeamName());
pane1.add(label[i], 0, i);
}
我正在尝试使用 for 循环将标签迭代添加到 JavaFX 中的 GridPane,但是当我尝试启动应用程序时,我总是遇到错误。控制台输出为:
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.IllegalArgumentException: Children: duplicate children added: parent = Grid hgap=10.0, vgap=10.0, alignment=TOP_CENTER
at javafx.scene.Parent.onProposedChange(Parent.java:454)
at com.sun.javafx.collections.VetoableListDecorator.add(VetoableListDecorator.java:206)
at javafx.scene.layout.GridPane.add(GridPane.java:965)
at com.comsci.drt.ProjectGUI.start(ProjectGUI.java:181)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null(GtkApplication.java:139)
我是这方面的初学者,但我知道它告诉我我正在尝试放置一个已经放置的对象。
代码:
Label l = new Label();
for(int i = 2; i <= 3; i++) {
l.setText(finalResultsArray[i].getTeamName()); <-- line 181
pane1.add(l, 0, i);
}
然后我继续使用一组标签,我相信这些标签不会尝试替换已经放置的对象,但我收到另一个错误:
Exception in Application start method
Exception in thread "main" java.lang.RuntimeException: Exception in Application start method
at com.sun.javafx.application.LauncherImpl.launchApplication1(LauncherImpl.java:917)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication(LauncherImpl.java:182)
at java.lang.Thread.run(Thread.java:745)
Caused by: java.lang.NullPointerException
at com.comsci.drt.ProjectGUI.start(ProjectGUI.java:175)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1(LauncherImpl.java:863)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl.lambda$null(PlatformImpl.java:295)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater(PlatformImpl.java:294)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.gtk.GtkApplication._runLoop(Native Method)
at com.sun.glass.ui.gtk.GtkApplication.lambda$null(GtkApplication.java:139)
代码:
Label[] label = new Label[12];
for(int i = 0; i < 12; i++) {
for(int j = 0; j < 1; j++) {
label[i].setText(finalResultsArray[i].getTeamName());
pane1.add(label[i], 0, i);
}
}
您需要为每个标签调用一个构造函数。对于您的第一个片段,只需将 "new Label" 调用移动到循环内。
每次要向网格添加文本时都需要使用新的 Label
实例。此外,新创建的数组填充了 null
个值。
因此,使这项工作可行的方法是
for(int i = 2; i <= 3; i++) {
Label l = new Label();
l.setText(finalResultsArray[i].getTeamName());
pane1.add(l, 0, i);
}
或
Label[] label = new Label[12];
for(int i = 0; i < 12; i++) {
label[i] = new Label();
label[i].setText(finalResultsArray[i].getTeamName());
pane1.add(label[i], 0, i);
}