Selecionar várias linhas no jTable

Olá pesoal, pesquisei aqui no forum mas não consegui achar um exemplo que pudesse entender, fiz meu table model como o pessoal recomenda, gostaria de selecionar mais de uma linha na jTable e recuperar o valor, para apenas uma linha consigo perfeitamente com o codigo abaixo, mas estou em duvida em qual evento eu uso para poder selecionar mais de uma linha e como organizar isso.

    AlunoDTO alunoDto = modeloAlunoDTO.getRow(jTableAluno.getSelectedRow());
            idAluno   = alunoDto.getIdAluno();
            nomeAluno = alunoDto.getNome();
            nomePai   = alunoDto.getNomePai();
            nomeMae   = alunoDto.getNomeMae();
            nomeResponsavel = alunoDto.getNomeResp();`

codigo abaixo do meu table model:

/*
 * To change this license header, choose License Headers in Project Properties.
 * To change this template file, choose Tools | Templates
 * and open the template in the editor.
 */
package com.projeto1.tabelmodel;

import com.escolanova.model.ControleMensalidade;
import java.text.SimpleDateFormat;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import javax.swing.table.AbstractTableModel;

/**
 *
 * @author
 */
public class TabelModelControleMensalidade extends AbstractTableModel {

// lista que vai conter todos os dados do JTable 
private List<ControleMensalidade> dataset;

private static final String[] col = {"Valor", "Desconto", "Data Vencimento"};

// Construtor da classe recebe os dados a ser populado 
public TabelModelControleMensalidade(List<ControleMensalidade> bean) {
    dataset = new ArrayList<ControleMensalidade>(bean);
    fireTableStructureChanged();
}

public TabelModelControleMensalidade() {
    dataset = new ArrayList<ControleMensalidade>();
    fireTableStructureChanged();
}

// Método sobrescrito que retorna o número de linhas do JTable, após populado  
@Override
public int getRowCount() {
    return dataset.size();
}

// Método sobrescrito que retorna o número de colunas do JTable após populado  
@Override
public int getColumnCount() {
    return col.length;
}

// Método sobrescrito que vai popular e retornar cada célula do JTable  
@Override
public Object getValueAt(int rowIndex, int columnIndex) {
    ControleMensalidade cbean = dataset.get(rowIndex);
    Object row = null;
    switch (columnIndex) {

        case 0:
            row = cbean.getValorMensalidade();
            break;
        case 1:
            row = cbean.getDesconto();
            break;
        case 2:
               //formata data na tabela
            SimpleDateFormat formata = new SimpleDateFormat("dd/MM/yyyy");
            row = formata.format(cbean.getDataVencimento());
            break;

        case 3:
            row = cbean.getIdAluno();
            break;
        case 4:
            row = cbean.getIdControleMensalidade();
            break;

    }
    return row;
}

/* Este método sobrescrito, defini se o JTable será editável ou não. 
 Voce pode definir qual coluna de qual linha será editável. Caso voce 
 defina que o seu JTable seja editável, então é necessário definir também 
 o método "setValueAt" que vem logo a seguir,  caso contrário, é só retornar 
 false para todas as linhas e colunas, como definido abaixo. */
@Override
public boolean isCellEditable(int rowIndex, int columnIndex) {
    //  return true; 
    return false;
}

/* Este método sobrescrito, permite voce editar o JTable, caso o método anterior 
 tenha algumas colunas de algumas ou todas linhas editáveis setadas para true, 
 ou que tenha como retorno o valor true para todas as linhas e colunas. */
@Override
public void setValueAt(Object value, int row, int col) {
    ControleMensalidade dado = dataset.get(row);

    switch (col) {
        case 0:
            dado.setValorMensalidade((Double) value);
            break;
        case 1:
            dado.setDesconto((Double) value);
            break;
        case 2:
          
            dado.setDataVencimento((Date) value);
            break;
        case 3:
            dado.setIdAluno((Long) value);
            break;
        case 4:
            dado.setIdControleMensalidade((Long) value);
            break;

    }
    fireTableCellUpdated(row, col);
}

// Este método sobrescrito define que tipo de dado será retornado para cada coluna 
@Override
public Class getColumnClass(int column) {
    if (column == 0) {
        return double.class;
    }
    if (column == 1) {
        return double.class;
    }
    if (column == 2) {
        return String.class;
    } else {
        return long.class;
    }
}

/* Este método criado por nós, vai retornar o conjunto 
 de dados inteiro do JTable, através de um List contendo 
 Objetos ClienteBean populados. */
public List<ControleMensalidade> getDataSet() {
    return dataset;
}

/* Este método sobrescrito vai definir o nome das colunas 
 que foi atribuído na constante "col" logo no início da classe */
@Override
public String getColumnName(int column) {
    return col[column];
}

/* Este método foi criado por nós para retornar um objeto ClienteBean 
 populado, de acordo com o número de linha do JTable fornecido pelo 
 parâmetro "int row" */
public ControleMensalidade getRow(int row) {
    return dataset.get(row);
}

/* Este método criado por nós, serve para voce criar um 
 ClienteBean e populá-lo fora do JTable e passar para este 
 método que vai acrescentar os dados na última linha do JTable 
 sem que haja a necessidade de se usar o método "setValueAt(...)" */
public void addRow(ControleMensalidade bean) {
    dataset.add(bean);
    fireTableDataChanged();
}

/* Este método foi criado por nós para remover uma linha 
 específica do JTable, de acordo com linha fornecida pelo 
 parâmetro "int row" */
public void removeRow(int row) {
    dataset.remove(row);
    fireTableDataChanged();
}

/* Este método criado por nós, acrescenta uma linha em branco 
 no JTable, caso voce queira inserir dados diretamente no JTable 
 tem que chamar este método antes. */
public void addEmptyRow() {
    dataset.add(new ControleMensalidade());
    fireTableDataChanged();
}

// metodo criado para limpar todos os dados da tabela.
public void clearRow() {
    dataset.clear();
    fireTableDataChanged();
}

}