2016-11-30 14 views
0

forループを使用してJavaFXのGridPaneにラベルを繰り返し追加しようとしていますが、アプリケーションを起動しようとするとエラーが発生します。コンソール出力は次のようになります。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$1(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$2.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$8(LauncherImpl.java:863) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(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$5(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$1(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$8(LauncherImpl.java:863) 
    at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$7(PlatformImpl.java:326) 
    at com.sun.javafx.application.PlatformImpl.lambda$null$5(PlatformImpl.java:295) 
    at java.security.AccessController.doPrivileged(Native Method) 
    at com.sun.javafx.application.PlatformImpl.lambda$runLater$6(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$5(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); 
    } 
} 

答えて

0

グリッドにテキストを追加するたびに、新しい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); 
} 
ある
0

ラベルごとにコンストラクタを呼び出す必要があります。最初のスニペットでは、ループ内でその「新しいラベル」コールを移動するだけです。

関連する問題