Oi,
A tá! Só agora que fui entender o que você queria. Então, o SINGLE_SELECTION não controla os checkbox marcados. E sim a quantidade de linha selecionada na lista.
Então você deverá fazer algo do tipo:
[code] // Aqui nós permitimos que as checkboxes sejam marcadas
// ou desmarcadas com o mouse
lista.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
int index = lista.locationToIndex(e.getPoint());
if(index != -1){
boolean tem_marcado = false;
for (int i = 0; i < lista.getModel().getSize() && !tem_marcado; i++) {
JCheckBox checkbox =
(JCheckBox) lista.getModel().getElementAt(i);
tem_marcado = checkbox.isSelected();
}
if (!tem_marcado) {
JCheckBox checkbox =
(JCheckBox) lista.getModel().getElementAt(index);
checkbox.setSelected(!checkbox.isSelected());
}
repaint();
}
}
});[/code]
Alteração no exemplo completo:
[code]import java.awt.;
import java.awt.event.;
import javax.swing.;
import javax.swing.border.;
public class Estudos extends JFrame{
JList lista;
public Estudos() {
super(“A classe JList”);
Container c = getContentPane();
c.setLayout(new FlowLayout(FlowLayout.LEFT));
// Cria a JList
lista = new JList();
// Define o renderizador de células
lista.setCellRenderer(new CheckBoxCellRenderer());
// Define os valores da lista
Object[] cbArray = new Object[4];
cbArray[0] = new JCheckBox("Goiânia");
cbArray[1] = new JCheckBox("Brasília");
cbArray[2] = new JCheckBox("Barra do Garças");
cbArray[3] = new JCheckBox("Curitiba");
// Atribue os itens à lista
lista.setListData(cbArray);
// Define a seleção única para a lista
lista.setSelectionMode(ListSelectionModel.SINGLE_SELECTION);
// Aqui nós permitimos que as checkboxes sejam marcadas
// ou desmarcadas com a barra de espaço
lista.addKeyListener(new KeyAdapter(){
public void keyPressed(KeyEvent e){
if(e.getKeyCode() == KeyEvent.VK_SPACE){
int index = lista.getSelectedIndex();
if(index != -1){
JCheckBox checkbox =
(JCheckBox) lista.getModel().getElementAt(index);
checkbox.setSelected(!checkbox.isSelected());
repaint();
}
}
}
});
// Aqui nós permitimos que as checkboxes sejam marcadas
// ou desmarcadas com o mouse
lista.addMouseListener(new MouseAdapter(){
public void mousePressed(MouseEvent e){
int index = lista.locationToIndex(e.getPoint());
if(index != -1){
boolean tem_marcado = false;
for (int i = 0; i < lista.getModel().getSize() && !tem_marcado; i++) {
JCheckBox checkbox =
(JCheckBox) lista.getModel().getElementAt(i);
tem_marcado = checkbox.isSelected();
}
if (!tem_marcado) {
JCheckBox checkbox =
(JCheckBox) lista.getModel().getElementAt(index);
checkbox.setSelected(!checkbox.isSelected());
}
repaint();
}
}
});
// Um botão que permite obter os itens marcados
JButton btn = new JButton("Obter itens marcados");
btn.addActionListener(
new ActionListener(){
public void actionPerformed(ActionEvent e){
String itens = "";
for(int i = 0; i < lista.getModel().getSize(); i++){
JCheckBox checkbox =
(JCheckBox) lista.getModel().getElementAt(i);
if(checkbox.isSelected())
itens += "Item com índice " + i +
" está marcado\n";
else
itens += "Item com índice " + i +
" está desmarcado\n";
}
JOptionPane.showMessageDialog(null,
itens);
}
}
);
// Adiciona a lista à janela
c.add(new JScrollPane(lista));
// Adiciona o botão à janela
c.add(btn);
setSize(350, 250);
setVisible(true);
}
public static void main(String args[]){
Estudos app = new Estudos();
app.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
}
}
// Classe personalizada que permite que os itens
// da lista sejam exibidos como JCheckBoxes
class CheckBoxCellRenderer implements ListCellRenderer{
Border noFocusBorder = new EmptyBorder(1, 1, 1, 1);
public Component getListCellRendererComponent(
JList list, Object value, int index,
boolean isSelected, boolean cellHasFocus){
JCheckBox checkbox = (JCheckBox) value;
checkbox.setBackground(isSelected ?
list.getSelectionBackground() : list.getBackground());
checkbox.setForeground(isSelected ?
list.getSelectionForeground() : list.getForeground());
checkbox.setEnabled(list.isEnabled());
checkbox.setFont(list.getFont());
checkbox.setFocusPainted(false);
checkbox.setBorderPainted(true);
checkbox.setBorder(isSelected ? UIManager.getBorder(
"List.focusCellHighlightBorder") : noFocusBorder);
return checkbox;
}
}[/code]
Tchauzin!