-1

我有一个简单的界面,旨在选择剧院中的一个或多个座位并为自己保留。

我有三列:区域/行/座位。您选择第一个填充第二个,选择第二个填充第三个。

当我第一次选择它们时没有问题。

第一次在所有三列中选择了一个项目

如果我更改第二排,第三排会重新填充(在这种情况下,所有排都有相同数量的座位)它不会中断!

在第二列中选择了一个新项目

但是,如果我更改第一行,一切都会中断!

在第一列中选​​择了一个新项目

现在原因很清楚,但我不明白为什么会这样。

这是第一个列表事件触发器:

List_Zona.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent arg0) {
                if (! arg0.getValueIsAdjusting()){

                    RowListModel.clear(); // second list
                    SeatListModel.clear(); // third list
                    List_Rand.clearSelection(); // second list
                    List_Scaun.clearSelection(); // third list

                    int[] rows = self.repository.getRowsForZone(
                              List_Zona.getSelectedValue().toString()
                    );
                    int index = 0;
                    while (rows[index]!=0) {
                          RowListModel.addElement(String.valueOf(rows[index]));
                          index++;
                    }
                }
            }
        });

它应该清除其他列选择,因此它不应该干扰下一个触发器(第二列),但显然它确实如此,或者发生了一些我没有得到的事情:

List_Rand.addListSelectionListener(new ListSelectionListener() {
            public void valueChanged(ListSelectionEvent arg0) {
                if (! arg0.getValueIsAdjusting()){

                    SeatListModel.clear();

                    int[] seats = self.repository.getSeatByZoneAndRow(
                          List_Zona.getSelectedValue().toString(),
                          Integer.parseInt(List_Rand.getSelectedValue().toString())//HERE
                    );
                    int index = 0;
                    while (seats[index]!=0) {
                        SeatListModel.addElement(String.valueOf(seats[index]));
                        index++;
                    }
                }
            }
        });

它无法解析整数,因为第二列应该被清除,但不是吗?但即使它不是......它是?

我想说的是:第二列应该清楚(不是),但如果不是,那么错误就不应该发生,但确实如此。

我希望这有点道理!

谁能发现问题?我应该提供更多代码吗?

错误是第二列的 NullPointerException,因为那里发生了一些可疑的事情(再次:在整数解析中)。

在我看来,当我单击第一列中的一个项目时,第二列valueChanged根本不应该触发。它应该只是清除其他两个,就是这样。为什么我错了?

PS First Code 片段负责破坏程序的第二个代码片段。

也许我还应该改写这个问题,当我重新选择一个新的“区域”(Zona)时,如何安全地清除所有内容 - 第一列?

4

1 回答 1

2

第一个侦听器清除 的选择List_Rand。这使得选择发生了变化:它从“选择了索引 i”变为“未选择索引”,因此调用了第二个侦听器。在第二个侦听器中,您尝试对 . 的选定值调用方法List_Rand。由于您刚刚清除了选择,因此不再有选择的值,因此出现 NullPointerException。

旁注:您的代码很难阅读,因为它不遵守 Java 命名约定。变量以小写字母开头,并且是驼峰式(名称中没有下划线)。

另一边注:打电话有什么意义parseInt(selectedValue.toString())?如果列表包含 Integer 实例,则将值直接转换为 Integer。如果它包含字符串,那么为什么不存储整数,因为这是您希望列表包含的内容?

于 2013-04-14T16:11:30.963 回答