Criei um Renderer customizado para utilizar JLabels como itens de uma JList, mas ao selecionar um deles, a cor de fundo não é modificada. Segue o código que criei (uma classe específica para tal Renderer):
Ja que vc ta estendendo o JLabel, retorna a propria classe que é um JLabel.
Muda seu codigo assim:
importjavax.swing.*;importjava.awt.*;publicclassXCellRendererextendsJLabelimplementsListCellRenderer{publicXCellRenderer(){setOpaque(true);}publicComponentgetListCellRendererComponent(JListlist,Objectvalue,intindex,booleanisSelected,booleancellHasFocus){// Component comp = (Component)value; // Seu value é um componente? Nao é uma String não?setText((String)value);setForeground(isSelected?Color.red:Color.black);setBackground(isSelected?Color.black:Color.white);returnthis;}}
Acho que pode ser isso… :roll:
danieldestro
Eu to fazendo assim:
ProdutosListCellRenderer render = new ProdutosListCellRenderer( produtos );
jListProdutos.setRenderer( render );
mas ele reclama que render não é do tipo correto do parâmetro do método setRender.
public class ProdutosListCellRenderer extends JLabel implements ListCellRenderer {
//...
}
brlima
é setCellRenderer()
danieldestro
hehehehe… valeu
eu tenho que dar um newno JList novamente?
devo passar algo pro constutor?
Eu quero exibir um list de objetos Produtos…
eu passo esse list pro meu ListCellReenderer…e ele mantem uma ref pro java.util.List.
brlima
Ahmm…
Dá uma olhada em ListModel.
Cria um modelo para a lista, com métodos para inserir e remover.
Sete seu renderer normalmente, sem passar lista nenhuma pra ele. QUem deve cuidar dos dados que sua list exibe é o Model. O renderer cuida só de como mostrar na list.
Se já usou uma JTable, é semelhante a ela como o model trabalha.
Capiti ?..rss
danieldestro
Ah sim! Agora eu entendí a separação.
Cispici? Si, è vero, io capisco tutte le cose che dice.
brlima
Bem, pra quem tá curioso, tem um exmeplo ai pra fazer funcionar uma JList com o modelo e o renderer customizados.
importjavax.swing.*;importjava.awt.*;importjava.util.*;/** * * @author Administrador */publicclassJListExample{privateJFrameframe=null;privateJListlista=null;/** Creates a new instance of JListExample */publicJListExample(){frame=newJFrame("JList Example;");frame.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);frame.setBounds(0,0,300,500);frame.setVisible(true);frame.show();lista=newJList();frame.getContentPane().add(lista,BorderLayout.CENTER);// Seta o modelo da us JlistArrayListarray=newArrayList();array.add("Linha 1");array.add("Linha 2");array.add("Linha 3");MyListModelmodelo=newMyListModel(array);lista.setModel(modelo);// Seta o rdenererMyListCellRendererrenderer=newMyListCellRenderer();lista.setCellRenderer(renderer);// Se quiser inserir Mais tira esse comentario:// modelo.addElement("Novo Elemento no Fim");// Dá um refresh na listalista.revalidate();}/** * @param args the command line arguments */publicstaticvoidmain(String[]args){JListExampleexample=newJListExample();}}/** * Monta o renderer */classMyListCellRendererextendsDefaultListCellRenderer{/** * Método para retornar o componente renderer que vc irá exibir * O default é um JLabel */publicComponentgetListCellRendererComponent(JListlist,Objectvalue,intindex,booleanisSelected,booleanhasFocus){// Chama o método super deleComponentsuperC=super.getListCellRendererComponent(list,value,index,isSelected,hasFocus);// Aqui vc pode alterar qualquer propriedade antes de retornar o componentesuperC.setForeground(java.awt.Color.RED);returnsuperC;}}/** * Monta o Model da List * Os métodos getSize() e getElementAt tem que ser implementados e sao obrigatorios */classMyListModelextendsDefaultListModel{privateArrayListminhaLista=null;/** Construtor recebendo a lista */publicMyListModel(ArrayListlista){minhaLista=lista;}/** * Returns the length of the list. * @return the length of the list */publicintgetSize(){// Aqui é so retornar o tamanha da sua listareturnminhaLista.size();}/** * Returns the value at the specified index. * @param index the requested index * @return the value at <code>index</code> */publicObjectgetElementAt(intindex){// Aqui vc tem que retornar uma string, que é o que será exibido// no seu renderer// Voce pode criar o seu objeto aqui e passar pra frente, mas// ai vc tem que tratar ele no renderer, ou seja, vc qtem que customizar// o renderer para esperar a propriedade value como seu objeto. returnminhaLista.get(index);}// Método criado pra mimpublicvoidaddElement(Stringvalue){// Aqui vc insere um novo valorminhaLista.add(value);// Aqui vc dispara quie inseriu um valor no final do seu modelofireIntervalAdded(this,(minhaLista.size()-1),(minhaLista.size()-1));}// Remove elementospublicvoidremoveElementAt(intindex){// Remove o elementominhaLista.remove(index);// Aqui vc dispara que removeu um certo elemento (index)fireIntervalRemoved(this,index,index);}}
danieldestro
Perfeito… agora sim eu entendí e funcionou.
Abraços