多个JList选择的索引相互分离

时间:2013-04-14 15:43:40

标签: java swing user-interface jlist selectedindexchanged

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

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

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

Selected an item in all three columns for the first time

如果我改变第二行,第三行重新填充(在这种情况下所有行都有相同数量的席位)它不会破坏!

Selected a new item in column two

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

Selected a new item in column one

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

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

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根本不会触发。它应该清除其他两个就是那个。为什么我错了?

P.S。第一个代码段负责第二个破坏程序。

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

1 个答案:

答案 0 :(得分:2)

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

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

其他方面注意:调用parseInt(selectedValue.toString())时有什么意义?如果列表包含Integer实例,则将值直接转换为Integer。如果它包含String,那么为什么不存储整数,因为这是你希望列表包含的内容?