我正在为JavaFX中的简单计划应用程序创建一个星期视图。该视图由8x49 GridPane
组成。第一列显示时间,第一行显示星期几,类似于Google日历和其他日历软件上的星期视图。当用户更改日期时,我想清除第一列和第一行以外的网格。我从另一个SO问题的答案中借用了一种方法。它可以在我的日视图面板中正常工作(除了2x49网格,代码完全相同),但在我的周视图面板中抛出NullPointerException
。
我添加了两个System.out.println()
语句以查看是否实际上是null
。据我所知,什么都没有。我删除了GridPane.getRowIndex(node) == row
来查看是否可能是问题所在,并且不再发生异常,这使我相信此声明某种程度上导致了异常。
这是从Shreyas Dave借来的冒犯方法。我添加了与下面的堆栈跟踪相关的行号:
130: private Node getNodeFromGridPane(GridPane gridPane, int col, int row) {
131: System.out.println("Gridpane: " + gridPane.getChildren().toString());
132: for (Node node : gridPane.getChildren()) {
133: System.out.println("Node: " + node.toString());
134: if (GridPane.getColumnIndex(node) == col && GridPane.getRowIndex(node) == row) {
135: return node;
136: }
137: }
138: return null;
139: }
这是调用getNodeFromGridPane
的方法:
private void clearAppointmentsColumn(){
for(int i = 0; i < 49; i++){
Node node = getNodeFromGridPane(grid, 1, i+1);
if(node != null){
grid.getChildren().remove(node);
}
}
}
这是System.out.println()
语句的输出以及堆栈跟踪的相关部分:
Gridpane: [Label@4b093381[styleClass=label]'Monday', Label@44994e49[styleClass=label]'Tuesday', Label@6f3b59bb[styleClass=label]'Saturday', Label@61dea913[styleClass=label]'Sunday', Label@2f46425[styleClass=label]'Thursday', Label@37370341[styleClass=label]'Wednesday', HBox@3b64a2ab, HBox@3031ce6e, HBox@2e8b5a86, HBox@7d2748fa, HBox@1f40aa1b, HBox@46404c48, HBox@6b829580, HBox@131fffd9, HBox@5a3e3d63, HBox@2f889183, HBox@5d56c9f0, HBox@5f2d13f2, HBox@37bf973, HBox@145f557e, HBox@6db9d36a, HBox@738a8500, HBox@49655482, HBox@75505497, HBox@5b1abd8b, HBox@557f1cad, HBox@223c3dd1, HBox@4d317b8e, HBox@3b093ec, HBox@1183928c]
Node: Label@4b093381[styleClass=label]'Monday'
Node: Label@44994e49[styleClass=label]'Tuesday'
Node: Label@6f3b59bb[styleClass=label]'Saturday'
Node: Label@61dea913[styleClass=label]'Sunday'
Caused by: java.lang.NullPointerException
at appointmentcalendar.WeekViewController.getNodeFromGridPane(WeekViewController.java:134)
at appointmentcalendar.WeekViewController.clearAppointmentsColumn(WeekViewController.java:108)
at appointmentcalendar.WeekViewController.setDate(WeekViewController.java:74)
at appointmentcalendar.MainWindowController.refreshWeekView(MainWindowController.java:467)
at appointmentcalendar.MainWindowController.datePicked(MainWindowController.java:455)
at appointmentcalendar.AppointmentCalendar.switchToMainWindow(AppointmentCalendar.java:90)
at appointmentcalendar.LoginFormController.loginClicked(LoginFormController.java:71)
... 75 more
第134行是if
中的getNodeFromGridPane
语句。
正如我所说,此方法在我的DayViewController
上是完美的,它实际上是相同的代码(WeekViewController.java
和WeekView.fxml
是直接复制并粘贴重复项,到目前为止唯一的区别是GridPane
中的列数。在WeekViewController
上运行时,该方法将在抛出异常之前恰好处理4个节点。每次它们都是相同的4个节点。我尝试从GridPane
中删除第5个节点,结果没有改变。该窗口将正确显示,并且应用程序中的所有其他功能都将正常运行。我看不到任何原因会抛出NullPointerException
。你们能发现我所缺少的东西吗?
更新
实际上,问题在于,正如Bastida所指出的,getRowIndex()
方法正在为某些节点返回null
。将方法修改为以下代码后,问题消失了:
private Node getNodeFromGridPane(GridPane gridPane, int col, int row) {
System.out.println("Gridpane: " + gridPane.getChildren().toString());
for (Node node : gridPane.getChildren()) {
System.out.println("Node: " + node.toString());
Integer c = GridPane.getColumnIndex(node);
c = c == null ? 0 : c;
Integer r = GridPane.getRowIndex(node);
r = r == null ? 0 : r;
if (c == col && r == row) {
return node;
}
}
return null;
}
谢谢。
答案 0 :(得分:1)
我认为您的问题是将int与Integer(它可以处理可能的null值)进行比较。
我认为您可以这样做来解决您的问题:
验证GridPane.getColumnIndex(node)
和GridPane.getRowIndex(node)
都是另一个不同于null的值,如下所示:
private Node getNodeFromGridPane(GridPane gridPane, int col, int row) {
System.out.println("Gridpane: " + gridPane.getChildren().toString());
for (Node node : gridPane.getChildren()) {
System.out.println("Node: " + node.toString());
if (GridPane.getColumnIndex(node) != null && GridPane.getRowIndex(node) != null &&
GridPane.getColumnIndex(node) == col && GridPane.getRowIndex(node) == row) {
return node;
}
}
return null;}
希望这对您有所帮助:)