java TableView getSelectedIndices () содержит индекс -1

У меня проблема с использованием getSelectedIndices(). Иногда, не всегда, как я обнаружил в сеансах отладки в коде базы данных, он возвращает массив, содержащий индекс -1.

Почему это так, и что я могу сделать, чтобы предотвратить это? Я хочу использовать этот стиль логики в разных местах.

У меня есть скот TableView с SelectionMode.МНОЖЕСТВЕННЫЙ.
Он имеет ContextMenu, который включает в себя («набор породы», «набор пола» и «набор теленка»)

Логика установки одного из этих атрибутов одинакова:
Пользователь (1) выбирает соответствующие строки (используя или + щелчок мыши), затем (2) выбирает соответствующий элемент меню

При этом setLivestockAttribute() вызывается следующим образом:

private void setLivestockAttribute( String attribute )
{
    String value = "";

    // 1. Get a List of the Indices of Rows selected.
    ObservableList<Integer> selectedIndices = null;
    selectedIndices = FXCollections.observableList(tblView_Livestock.getSelectionModel().getSelectedIndices());        

    // If ONE or MORE rows have been selected.
    if ( selectedIndices.size() > 0 )
    {
        // 2. Get the VALUE of the relevant ATTRIBUTE.
        switch (attribute) 
        {
            case LM_Constant.BREED:
                value = LM_Utility.getChoice_Breed();
                break;
            case LM_Constant.SEX:
                value = LM_Utility.getChoice_Sex();
                break;
            case LM_Constant.HAS_CALF:
                value = LM_Utility.getChoice_HasCalf();
                break;                    
        }

        // If there is a VALUE.
        if ( value.length() > 0 )
        {
            ObservableList<LivestockModel> dataList = tblView_Livestock.getItems();

            // 3. Update each Livestock record.
            DataStore.getInstance().updateLivestock(dataList, selectedIndices, attribute, value);

            // 4. Refresh the TableView to show changes.
            setLivestockData();    
        }
    }
}

1 ответ

  1. Я решил:

    • обновите JDK ( как предложено @sillyfly)
    • настройте код, чтобы избежать ошибки (см. ниже)
    • подпишитесь на Oracle, чтобы получать уведомления о будущих обновлениях и исправлениях ошибок

    Сегмент кода обеспечивает обновление базы данных, только когда индекс i >= 0.

    public boolean updateLivestock(ObservableList<LivestockModel> livestockData, ObservableList<Integer> selectedIndices, String attribute, String value)
    {
        boolean proceed = true;
        boolean updated = false;
        int rowCount = 0;
        int counter = 0;
        String sql = "";
        LivestockModel lm;
    
        switch (attribute) 
        {
            case LM_Constant.BREED:
                sql = "UPDATE livestock SET (breed, last_updated) = (?, DEFAULT) WHERE rfid = ? AND begin_event = ?";
                break;
            case LM_Constant.SEX:
                sql = "UPDATE livestock SET (sex, last_updated) = (?, DEFAULT) WHERE rfid = ? AND begin_event = ?";
                break;
            case LM_Constant.HAS_CALF:
                sql = "UPDATE livestock SET (has_calf, last_updated) = (?, DEFAULT) WHERE rfid = ? AND begin_event = ?";
                break;                
        }
    
        try ( PreparedStatement preparedUpdate = connection.prepareStatement(sql) )
        {            
            for (Integer i : selectedIndices)
            { 
                if ( proceed != true )
                    break;
    
                if ( i >= 0 )
                {
                    lm = livestockData.get(i);
    
                    preparedUpdate.setString(1, value);
                    preparedUpdate.setString(2, lm.getRFID());
                    preparedUpdate.setInt(3, lm.getBeginEvent());
    
                    rowCount = preparedUpdate.executeUpdate();
                    if ( rowCount == 1 )
                        counter++;
                }
                else
                {
                    counter++;
                    LM_Utility.showError_Dialog("Update Livestock", "Index Error", "index = " + i.toString());
                }
            }
    
            if ( counter == selectedIndices.size() )
            {   
                connection.commit();               
                updated = true;   
            }
    
        }
        catch (SQLException sqle)
        {
            LM_Utility.showSQL_Exception("updateLivestock()", sqle); 
            proceed = false;
        }        
    
        return updated;
    }