ListCellRenderer extends JCheckBox

di il
6 risposte

ListCellRenderer extends JCheckBox

Ciao a tutti,
sono nuovo del forum è questa è la mia prima domanda (spero non sia troppo stupida).

Ho creato una classe che implementa la ListCellRenderer che estende la CheckBox in modo da dinamicamente una lista di oggetti rappresentati da una CheckBox ma quest'ultima non è selezionabile anche se risulta attiva.

Di seguito un codice di esempio dove ho utilizzato per comodità una lista di oggetti di tipo String anche se nel mio codice sarà una lista di oggetti creati da me:

import javax.swing.*;
import java.awt.*;

public class CellRendererDemo extends JCheckBox implements ListCellRenderer {

	@Override
	public Component getListCellRendererComponent(JList list, Object value, int index, boolean isSelected,
			boolean cellHasFocus) 
	{
		String s = (String)value;
		this.setText(s);
		
		// TODO Auto-generated method stub
		return this;
	}
	
	public static void main(String[] args) {
		String[] s = {"a","b","c"};
		
		JFrame frame = new JFrame();
		
		frame.setTitle("Prova CheckBox");
		frame.setSize(400,130);
		frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		
		JList<String> list = new JList<String>();
		list.setCellRenderer(new CellRendererDemo());
		DefaultListModel<String> listModel = new DefaultListModel<String>();
		
		for(int i=0;i<s.length;i++)
			listModel.addElement(s[i]);
		
		list.setModel(listModel);
		
		frame.getContentPane().add(list,BorderLayout.CENTER);
		
		frame.setVisible(true);
	}
}
Grazie in anticipo per l'aiuto, ciao.

6 Risposte

  • Re: ListCellRenderer extends JCheckBox

    charlesmm ha scritto:


    Ho creato una classe che implementa la ListCellRenderer che estende la CheckBox in modo da dinamicamente una lista di oggetti rappresentati da una CheckBox ma quest'ultima non è selezionabile anche se risulta attiva.
    JList contempla solo l'uso di un "renderer" ... senza alcun "editor" (come invece avviene per JTable). Pertanto il componente che si vorrebbe gestire nella cella può solo essere "stampato" letteralmente nella cella ma NON può ricevere alcuna azione né avere un qualche comportamento.

    Una soluzione: invece che JList, potresti sfruttare JTable, che ha la capacità nativa (tramite renderer/editor predefiniti) di gestire un checkbox nelle celle. Puoi vedere il mio esempio Checkboxes Table
  • Re: ListCellRenderer extends JCheckBox

    Ciao Andrea,
    grazie mille.

    Non ho ben capito come il codice faccia ad attivare la CheckBox (sono riuscito a crearla ma non riesco a selezionarla) ma approfondisco l'utilizzo della JTable.

    Grazie ancora, ciao.

    MIchele
  • Re: ListCellRenderer extends JCheckBox

    charlesmm ha scritto:


    Non ho ben capito come il codice faccia ad attivare la CheckBox (sono riuscito a crearla ma non riesco a selezionarla)
    Con JList NON puoi.
  • Re: ListCellRenderer extends JCheckBox

    Ciao Andrea,
    scusami ma mi sono espresso male, in realtà mi riferivo al codice di esempio che mi hai indicato.
    Penso di aver capito che la CheckBox viene creta dal metodo 'getColumnClass' con l'istruzione "return Boolean.class;", ho cercato di ricreare una caso utilizzando tale metodo ma ritrovo il check già attivo e non riesco a disattivarla/attivarla.

    Grazie ancora, ciao.

    MIchele
  • Re: ListCellRenderer extends JCheckBox

    charlesmm ha scritto:


    scusami ma mi sono espresso male, in realtà mi riferivo al codice di esempio che mi hai indicato.
    Ok, pensavo ti riferissi ancora a JList

    charlesmm ha scritto:


    Penso di aver capito che la CheckBox viene creta dal metodo 'getColumnClass' con l'istruzione "return Boolean.class;", ho cercato di ricreare una caso utilizzando tale metodo ma ritrovo il check già attivo e non riesco a disattivarla/attivarla.
    JTable ha già dei renderer/editor predefiniti. Se per una certa colonna si espone dal model il Class di Boolean, JTable "sa" già di dover usare renderer/editor per gestire un checkbox (non devi fare niente di altro particolare). Ma è importante anche un'altra cosa: la cella deve essere editabile e questo è esposto dal isCellEditable.

    Poi l'oggetto trattato da getValueAt/setValueAt per quella colonna dovrà essere ovviamente un Boolean.
  • Re: ListCellRenderer extends JCheckBox

    Grazie mille.
Devi accedere o registrarti per scrivere nel forum
6 risposte