Java 索引表中选定行的越界异常
从表视图中选择行时出现索引越界异常。以下是我如何从数据库中获取数据:Java 索引表中选定行的越界异常,java,mysql,javafx,indexoutofboundsexception,Java,Mysql,Javafx,Indexoutofboundsexception,从表视图中选择行时出现索引越界异常。以下是我如何从数据库中获取数据: public List<Category> populateCategoryTable() { List ll = new LinkedList(); try { db.getConnection(); String sql = "SELECT * FROM sm_category"; ResultSet rs = null; //
public List<Category> populateCategoryTable() {
List ll = new LinkedList();
try {
db.getConnection();
String sql = "SELECT * FROM sm_category";
ResultSet rs = null;
// Call readRequest to get the result
rs = db.readRequest(sql);
while (rs.next()) {
String ID = rs.getString("categoryID");
String name = rs.getString("categoryName");
String desc = rs.getString("categoryDescription");
Category row = new Category();
row.setid(ID);
row.setname(name);
row.setdesc(desc);
ll.add(row);
}
rs.close();
} catch (SQLException ex) {
ex.printStackTrace();
System.out.println("Error SQL!!!");
System.exit(0);
}
return ll;
}
然而,在添加了所选行代码的垃圾之后,我得到了索引越界异常。错误消息是:
java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:208)
at javafx.scene.control.TableView$TableViewArrayListSelectionModel$6.get(TableView.java:1757)
at javafx.scene.control.TableView$TableViewArrayListSelectionModel$6.get(TableView.java:1755)
at shopManagement.boundary.RetrieveProductUI$1.onChanged(RetrieveProductUI.java:101)
at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:291)
at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:48)
有人知道为什么会有索引越界异常吗?我的代码中没有红线
提前感谢。您可以通过FXCollections创建ObservableList,如果您只使用table.getItems(),它将自动创建,因此usage table.getItems().setAll(…)很好,您可以使用调试器轻松验证这一点 以下代码应该有帮助:
while(change.next(){
if(change.wasAdded()){
TableView.TableViewSelectionModel selectionModel = viewCategory.getSelectionModel();
ObservableList selectedCells = selectionModel.getSelectedCells();
TablePosition tablePosition = (TablePosition) selectedCells.get(0);
int row = tablePosition.getRow(); // yields the row that the currently selected cell is in
System.out.println(row);
}
}
您还可以更改此代码:
TableView.TableViewSelectionModel selectionModel = viewCategory.getSelectionModel();
ObservableList selectedCells = selectionModel.getSelectedCells();
与:
但是,如果您只想找到最后一行,可以使用:
UPD:
//viewCategory.getSelectionModel().setCellSelectionEnabled(true);
//viewCategory.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
viewCategory.getSelectionModel().selectedIndexProperty().addListener(新的ChangeListener()){
@凌驾
更改公众假期(ObservalEvalue请显示您的表结构。列的名称是什么?提供完整的stacktrace,其中包含您的类的详细信息,以便我们可以看到错误的确切点。我从数据库检索数据并将其显示在表中没有问题。错误仅在我选择表中的行时发生。我将注释掉该部分。请参阅我的updatescheck onchange函数中selectedCell的大小,我认为每当您选择一行并调用onchange时,列表中就没有selectedCell了。是的,它显示了[]在控制台中。那么我应该如何修复它?您的意思是在changeListener中添加if语句?以及从何处获取列表?因为我正在动态检索数据。我没有手动可观察列表来设置数据。如果遵循您的代码,我将获得IllegalStateException@Carol,将在更改时获取事件目标列表。getList()calling.ObservableList是由TableView创建的,但我不确定何时创建实例,或者在第一次调用getItems()时延迟。但我得到了IllegalStateException。你知道为什么吗?但它不应该只获取所选行的第一列值吗?我们需要添加新元素吗?尝试添加其他代码:while(change.next()){\\code from post}对不起,忘记了初始状态。
java.lang.IndexOutOfBoundsException: Index: 1, Size: 0
at java.util.ArrayList.rangeCheck(ArrayList.java:604)
at java.util.ArrayList.get(ArrayList.java:382)
at com.sun.javafx.collections.ObservableListWrapper.get(ObservableListWrapper.java:208)
at javafx.scene.control.TableView$TableViewArrayListSelectionModel$6.get(TableView.java:1757)
at javafx.scene.control.TableView$TableViewArrayListSelectionModel$6.get(TableView.java:1755)
at shopManagement.boundary.RetrieveProductUI$1.onChanged(RetrieveProductUI.java:101)
at com.sun.javafx.collections.ListListenerHelper$Generic.fireValueChangedEvent(ListListenerHelper.java:291)
at com.sun.javafx.collections.ListListenerHelper.fireValueChangedEvent(ListListenerHelper.java:48)
while(change.next(){
if(change.wasAdded()){
TableView.TableViewSelectionModel selectionModel = viewCategory.getSelectionModel();
ObservableList selectedCells = selectionModel.getSelectedCells();
TablePosition tablePosition = (TablePosition) selectedCells.get(0);
int row = tablePosition.getRow(); // yields the row that the currently selected cell is in
System.out.println(row);
}
}
TableView.TableViewSelectionModel selectionModel = viewCategory.getSelectionModel();
ObservableList selectedCells = selectionModel.getSelectedCells();
ObservableList selectedCells = change.getList();
//viewCategory.getSelectionModel().setCellSelectionEnabled(true);
//viewCategory.getSelectionModel().setSelectionMode(SelectionMode.MULTIPLE);
viewCategory.getSelectionModel().selectedIndexProperty().addListener(new ChangeListener<Number>() {
@Override
public void changed(ObservableValue<? extends Number> observableValue, Number number, Number number1) {
if ((Integer) number1 >= 0) {
Category cat = (Category) table.getItems().get(number1);
String id = cat.getid();
\\here you can fetch DB for aditional info and pass it somewhere
}
}
});