Problema com combobox renderer

7 respostas
V

Olá pessoal tudo bem

Estou com um probleminha em meu combobox renderer.
Tentei implementar um renderer como explicado no site da sun,
O problema é que os valores da minha lista não aparecem como deveriam.
Inicialmente na minha lista aparece apenas uma valor (repetido n vezes, onde n = número de itens da minha lista)
Quando eu passo o mouse sobre esta lista, os valores vão se alterando (aqui ele mostra os valores que deveriam estar sobre a lista). Se eu fico passando o mouse sobre esta lista ele fica alterando os valores dela infinitamente, é muito estranho .

Abaixo vai o meu renderer
public class Renderer extends JLabel implements ListCellRenderer {
     public Component getListCellRendererComponent(
             JList list,
             Object valorAtual,
             int index,
             boolean isSelected,
             boolean cellHasFocus) {
 
             setText(list.getSelectedValue().toString());
             setFont(list.getFont());
             return this;
     }
     
 }

7 Respostas

V

O meu problema no código acima tem sido setar o texto (setText) com o valor selecionado da combo…
Quando faço isso ele seta todos os valores da lista como sendo do valor selecionado.

Como faço para pegar individualmente o valor de cada item na jlist e setar ele individualmente no label que vai aparecer no combo?

Abraços
Dirceu

brlima

Ja tentou parar de usar o item selecionado na JList e usar o objeto que foi enviado para vc ?

Pelo que me lembro, a JList é so uma referencia para a que esta na tela, o objeto selecionado é o objeto enviado para vc, onde vc pega ele ( que veio do listModel ) e retorna um renderer para a JList que vai adiciona-lo visivelmente para vc na tela.

Resumindo, faz assim:

public class Renderer extends JLabel implements ListCellRenderer {
      public Component getListCellRendererComponent(
              JList list,
              Object valorAtual,
              int index,
              boolean isSelected,
              boolean cellHasFocus) {
  
              setText((String)valorAtual);
              setFont(list.getFont());
              return this;
      }
      
  }

desde que o objeto valorAtual seja uma String.

flw!

V

Pocha cara valeu…
Acabei sacando esta besteira que eu fiz, antes mesmo de ver a sua resposta…
ehhehe

O problema agora é que ele não está mudando a cor dos items quando eu passo o mouse sobre eles…
isso deveria ser feito com aquele

if (isSelected) {
                    setBackground(Color.BLUE);
                    setForeground(list.getSelectionForeground());
            } else {
                    setBackground(list.getBackground());
                    setForeground(list.getForeground());
            }

Só que não sei o por que que não está rolando…

Alguma dica?

Abraços

brlima

verifica se não tá faltando um setOpaque(true) no renderer, antes de pintar o fundo.

V

NA lata!!!
Valeu velho…

Por que que temos que setar ele para opaco para que isto funcione?

brlima

por default ele é opaque(false) por 2 motivos ( na minha opiniao )
1- Pra ele poder ficar transparente :smiley: Ou seja, ter a mesma cor do objeto de fundo

2- Ganho de performance: um objeto demora bem menos pra ser “desenhado na tela” com essa propriedade. Se todos os objetos que vc tem na tela tivessem essa propriedade pra true, ia ser mais lerdinha a tela.

ps: é uma propriedade de Component se não me engano, logo, todos os componentes tem.

V

brlima:

ps: é uma propriedade de Component se não me engano, logo, todos os componentes tem.

Vivendo e aprendendo…

É isto mesmo, é uma propriedade do componente

Criado 5 de abril de 2005
Ultima resposta 8 de abr. de 2005
Respostas 7
Participantes 2