Important Notice - Forums is archived
To simplify things and help our users to be more productive, we have archived the current forum and focus our efforts on helping developers on Stack Overflow. You can post new questions on Stack Overflow or join our Discord channel.

Vaadin lets you build secure, UX-first PWAs entirely in Java.
Free ebook & tutorial.
BeanItemContainer & Grid selection, how to use GetItem() with only Object
I'm having a hard time with this and I'm a beginner so please yell at my bad programming practices and tell me if there's a better way to solve this if possible.
I have a grid. It pulls data from an Access database. (I'm using UCanAccess) I allow the user to filter the entries by Date, then make a selection, and choose to email those entries.
Let's say I run the program. On the page, I choose a date, the Grid will pull the info from that date. I select a few entries, and click the sendToEmailBtn. Everything works.
Now I choose another date, and the grid is refreshed with a different set of entries. Everything displays properly, it pulled the data correctly.
But this time, when I click sendToEmailBtn, I get a nullpointerexception. I'm guessing because the indexID for the grid is now different from the Index of the BeanItemContainer. (since in the code, to change the grid, I simply used removeAllItems) But I'm not sure what to do here? Is there any other way to do this?I tried to just do this
I wanted to try setting the beanHolder = null and resetting up the grid, etc, but I thought there had to be a better way? Unless there isn't? I just wanted to know if there's any other way of using an object to get a bean from BeanItemContainer.
Setting up grid:
[code]BeanContainer<String, Bean> beanHolder = new BeanContainer<String, Bean>(Bean.class);
beanHoldier.setBeanIdProperty("TID");
//Sets up the grid of Beans.
Grid grid = new Grid (beanHolder);
grid.setEditorEnabled(true); //Allow changing some parts of the Bean,
//might change later to not allow any changes.
grid.removeColumn("TID"); //Don't show this column, but it is there.
grid.setSelectionMode(SelectionMode.MULTI); //Allows to pick multiple entries.
[/code]
This is my date filter button:
dateButton.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event){
beanHolder.removeAllItems();
try {
Class.forName("net.ucanaccess.jdbc.UcanaccessDriver");
Connection conn=DriverManager.getConnection("jdbc:ucanaccess://\\\\server\\folder\\AccessDatabase.mdb");
Statement s = conn.createStatement();
ResultSet rs = s.executeQuery("SELECT [PLANT], [DEPARTMENT], [Entry-dt], [TID] FROM [Query1] where [RESOURCE] NOT LIKE 'Example*' AND [Entry-dt] = #"+new SimpleDateFormat("MM/dd/yyyy").format(df.getValue())+"#");
Bean bean = new Bean();
while (rs.next()) {
bean.setPlant(rs.getString(1));
bean.setDepartment(rs.getString(2));
bean.setEntryDate(rs.getString(3).split("\\s")[0].split("-")[1] + rs.getString(3).split("\\s")[0].split("-")[2]+ rs.getString(3).split("\\s")[0].split("-")[0].substring(2));
beanHolder.addBean(bean);
bean = null;
bean = new Bean();
}
rs.close();
} catch (ClassNotFoundException | SQLException e) {
e.printStackTrace();
}
}
});
And this is where the selection error happens (nullpointerexception)
sendToEmailBtn.addClickListener(new ClickListener() {
private static final long serialVersionUID = 1L;
@Override
public void buttonClick(ClickEvent event){
//*
A lot of email code
*//
try{
//Container to hold failed posted Beans
BeanContainer<String, Bean> failureBeans = new BeanContainer<String, Bean>(Bean.class);
//Email code cut out
//Gets which Time entries were selected by User.
MultiSelectionModel selection = (MultiSelectionModel) grid.getSelectionModel();
selection.getSelectedRows(); ////////////Error happens here
//Cycles through each one and emails
for (Object itemId: selection.getSelectedRows()){
beanHolder.getItem(itemId).getBean();
//tests for failed sent entries
if (Body.asText().contains("row 1")){
pw.write(beanHolder.getItem(itemId).getBean().toString()+ "\r\n");
failureBeans.addBean(beanHolder.getItem(itemId).getBean());
}
}//End For Loop
if (failureBeans.size() >0)
UI.getCurrent().addWindow(new BeanErrorWindow(failureBeans));
pw.close();
webClient.close();
}catch(FailingHttpStatusCodeException | IOException e){
e.printStackTrace();
}
Notification.show("Completed.");
} // Click Event
I changed some of the variable names to try to make the code easier to read.
Just a guess, but it could be that the selection model still has references to the previously selected beans.
When you do beanHolder.removeAllItems(); could you try to do a
grid.setSelectionMode(SelectionMode.NONE);
grid.setSelectionMode(SelectionMode.MULTI);
This should re-initialize the selection model, if it works then that's the issue.
It worked, thank you! I never would have thought of that!