immer die Tasten in einer gridPane und ändern Sie Ihre text mit javaFx

Ich versuche, um alle Mitglieder einer gridPane (Sie sind button) in meiner controller-Klasse , aber ich bin immer Ausnahme, dass Sie es sehen können unter:

Exception in Application start methodjava.lang.reflect.InvocationTargetException
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at com.sun.javafx.application.LauncherImpl.launchApplicationWithArgs(LauncherImpl.java:389)
at com.sun.javafx.application.LauncherImpl.launchApplication(LauncherImpl.java:328)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
at java.lang.reflect.Method.invoke(Method.java:497)
at sun.launcher.LauncherHelper$FXHelper.main(LauncherHelper.java:767) 
Caused by: 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$152(LauncherImpl.java:182)
    at com.sun.javafx.application.LauncherImpl$$Lambda$51/1263764.run(Unknown Source)
    at java.lang.Thread.run(Thread.java:745)
Caused by: javafx.fxml.LoadException: 
file:/C:/Users/Family/Documents/NetBeansProjects/FarsiCallender/dist/run1583526066/FarsiCallender.jar!/farsicallender/FXMLDocument.fxml
at javafx.fxml.FXMLLoader.constructLoadException(FXMLLoader.java:2605)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2583)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2445)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3218)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3179)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3152)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3128)
at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:3108)
at javafx.fxml.FXMLLoader.load(FXMLLoader.java:3101)
at farsicallender.FarsiCallender.start(FarsiCallender.java:29)
at com.sun.javafx.application.LauncherImpl.lambda$launchApplication1$159(LauncherImpl.java:863)
at com.sun.javafx.application.LauncherImpl$$Lambda$54/4239053.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$runAndWait$172(PlatformImpl.java:326)
at com.sun.javafx.application.PlatformImpl$$Lambda$47/20085625.run(Unknown Source)
at com.sun.javafx.application.PlatformImpl.lambda$null$170(PlatformImpl.java:295)
at com.sun.javafx.application.PlatformImpl$$Lambda$49/3796086.run(Unknown Source)
at java.security.AccessController.doPrivileged(Native Method)
at com.sun.javafx.application.PlatformImpl.lambda$runLater$171(PlatformImpl.java:294)
at com.sun.javafx.application.PlatformImpl$$Lambda$48/2900468.run(Unknown Source)
at com.sun.glass.ui.InvokeLaterDispatcher$Future.run(InvokeLaterDispatcher.java:95)
at com.sun.glass.ui.win.WinApplication._runLoop(Native Method)
at com.sun.glass.ui.win.WinApplication.lambda$null$145(WinApplication.java:101)
at com.sun.glass.ui.win.WinApplication$$Lambda$37/17230114.run(Unknown Source)
... 1 more
Caused by: java.lang.NullPointerException
    at farsicallender.FXMLDocumentController.setDays(FXMLDocumentController.java:249)
    at farsicallender.FXMLDocumentController.initialize(FXMLDocumentController.java:181)
    at javafx.fxml.FXMLLoader.loadImpl(FXMLLoader.java:2552)
    ... 22 more
Exception running application farsicallender.FarsiCallender
Java Result: 1

diese Ausnahme kommt aus diesem Teil von meinem code vor dem Einchecken meinen code, den Sie haben, um zu wissen, dass ich ein gridPane (6*7) und das ist mein code:

for (int i = 0; i < 6; i++) {
     for (int j = 0; j < 7; j++) {
         for (Node node : grid.getChildren()) {
             if (grid.getRowIndex(node) == i && grid.getColumnIndex(node) == j) {
                  Button b = (Button)node;
                  b.setText(ar[i][j]+"");
                  System.out.println("z:" + i+" "+j);
                  break;
             }
         }
     }
}

Linie 249 ist :

if (grid.getRowIndex(node) == i && grid.getColumnIndex(node) == j) {
  • Können Sie uns sagen, welche Zeile ist Zeile 249?
  • hier sind Sie…(am Ende meiner Frage)
  • Ist das nicht die IDE geben Sie Warnungen für diese Zeile überhaupt?



One Reply
  1. 1

    Als eine Nebenbemerkung, Sie sollten nicht Aufruf von statischen Methoden, die von einer nicht-statischen Kontext. Ihre IDE sollte Sie warnen, über diese. Aber Sie sollten

    GridPane.getRowIndex(node)

    nicht

    grid.getRowIndex(node)

    etc.


    Die Methode GridPane.getRowIndex(Knoten) und GridPane.getColumnIndex(Knoten) return wrapper Integer Objekt, nicht eine primitive int. Folglich wenn Sie vergleichen, indem Sie Identität mit == Sie sind implizit mit unboxing. In anderen Worten, dein code ist äquivalent zu

    if (GridPane.getRowIndex(node).intValue() == i 
      && GridPane.getColumnIndex(node).intValue() == j) { ... }

    Wenn alle Knoten Hinzugefügt, um Ihre raster-ohne Zeilenindex und Spaltenindex angegeben, dann GridPane.getRowIndex(...) oder GridPane.getColumnIndex(...) null zurück, so würde man implizit versucht, rufen Sie intValue() auf eine null-Referenz, wodurch eine null-Zeiger-Ausnahme. Beachten Sie, dass wenn Sie angerufen haben grid.setGridLinesVisible(true); dies bewirkt, dass die GridPane einen Knoten hinzufügen, dass keine Zeilenindex oder Spaltenindex festgelegt.

    Also die schnelle Lösung für dieses ist, zu tun, einen null-check:

    Integer rowIndex = GridPane.getRowIndex(node);
    Integer columnIndex = GridPane.getColumnIndex(node);
    
    if (rowIndex != null && rowIndex.intValue() == i
      && columnIndex != null && columnIndex.intValue() == j) {
    
        //...
    }

    Ich würde es wahrscheinlich vorziehen, um den code zu organisieren, so dass die Tasten gehalten werden, in einem array, so können Sie auf Sie zugreifen, ohne iteration, aber ich denke, das ist nur eine Sache des Stils.

    • danke. dieser code war für jede Taste, außer der ersten Zeile und ersten Spalte.
    • vielleicht sind die Zeilen-und Spaltenindexposition sind null für die erste Zeile und die erste Spalte? Ich denke, das wäre standardmäßig auf null… ich möchte nur sicherstellen, dass Sie richtig zuordnen Zeilen-Indizes und Spalten-Indizes, um jeden button. Alternativ können Sie if (rowIndex == null) { rowIndex = 0 ;} if (columnIndex == null) { columnIndex = 0 ;} und dann nur if (rowIndex.intValue() == i && columnIndex.intValue() == j) { ... }.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.