Renderer e JTable

11 respostas
E

Galera,

Criei um Renderer para poder pintar uma determinada célula, até aqui tudo bem, mas estou com dois problemas:

  1. Só consigo mudar a cor do foreground, a do background não funciona.
  2. Quando seleciono alguma linha no JTable, a coluna que possui o renderer não fica selecionada.

Alguem pode me ajudar?

Everson

11 Respostas

D

Se vocês estiver estendendo o renderer de um JLabel, ajuste a opacidade com setOpaque(true). Daí o setBackground(…) vai funcionar.

E

Dango, vc é o cara !!!

Mais uma vez obrigado.

Aproveitando a oportunidade, eu só coloquei o renderer em uma coluna, tem como eu pintar uma linha toda, baseado o neste renderer?

E

E sobre a outra duvida, que ele não seleciona a linha, alguma sugestão?

D

Se todas as suas colunas forem Strings, use o mesmo renderer, com o método setDefaultRenderer(String.class, <teu-renderer>).

D

O método setOpaque() deveria ter resolvido do problema da seleção… por que quando está selecionado, você deveria mudar a cor de fundo e como o componente era transparente, a mudança da cor de fundo não tinha efeito. Se o problema persiste, poste o código do teu renderer pra galera conferir.

E

Dango,

Veja se eu entendi direito o que vc quis quizer, quando mandou eu setar o “setDefaultRenderer”, eu setei ele na JTable, é isso mesmo?

Tb quando seleciono qualquer linha, a coluna que esta com o renderer não fica marcada como selecionada.

O Fonte esta abaixo, por favor, se puder me de um help.

// jt é o meu JTable
jt.setSelectionMode(ListSelectionModel.MULTIPLE_INTERVAL_SELECTION);

MyTableCellRenderer render =  new MyTableCellRenderer();
  jt.setDefaultRenderer(String.class, render);

  TableColumn col = jt.getColumnModel().getColumn(0);
  col.setCellRenderer(render);
// Renderer

public class MyTableCellRenderer extends JLabel implements TableCellRenderer {

public Component getTableCellRendererComponent(JTable table, Object value,

boolean isSelected, boolean hasFocus, int rowIndex, int vColIndex) {

setText(value.toString());
Font fonte;
          fonte = new Font("",Font.PLAIN,12);
          setFont(fonte);
          setHorizontalAlignment(CENTER);
          setOpaque(true);

          if ( (((String) value).compareTo("I") == 0) || (((String) value).compareTo("I*") == 0) )  {
            setForeground(java.awt.Color.black);
            setBackground(java.awt.Color.white);
          }

          if ( (((String) value).compareTo("A") == 0) || (((String) value).compareTo("A*") == 0) )  {
            setForeground(java.awt.Color.white);
            setBackground(java.awt.Color.blue);
          }

          if ( (((String) value).compareTo("K") == 0) || (((String) value).compareTo("K*") == 0) )  {
            setForeground(java.awt.Color.white);
            setBackground(java.awt.Color.red);
          }

          return this;
      }

      public void validate() {}
      public void revalidate() {}
      protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
      public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
  }
paulohbmetal

Talvez isso aqui possa te ajudar também:
http://www.guj.com.br/forum/viewtopic.php?t=12628&highlight=

A Paz!!

D

:shock: nossa! cuidado, velhinho! vários erros:

  1. Troque esses métodos compareTo() por equals()… isso ai não funcionar nunca!

  2. Aqueles métodos que vc deixou sem implementação (validate() e revalidate()), remove eles… deixa pra superclasse (o JLabel) se virar com eles…

Tenta fazer isso… se não funfar, posta de novo :wink:

D

Olha, eu tomei a liberdade de sugerir uma implementação (queira me desculpar a "arrogância", mas não resisti -- talvez não seja o que vc está precisando)

public class MyTableCellRenderer extends JLabel 
                                 implements TableCellRenderer {

   public Component getTableCellRendererComponent(
                               JTable table,
                               Object value,
                               boolean isSelected, 
                               boolean hasFocus,
                               int rowIndex,
                               int vColIndex) {
      

      setFont(getFont().deriveFont(Font.PLAIN));
      setHorizontalAlignment(CENTER);
      setOpaque(true);
     
      String svalue = value.toString();
      
      setText(svalue);
      
      if (svalue.startsWith("I")) {
         setForeground(java.awt.Color.black);
         setBackground(java.awt.Color.white);
      }
      else if (svalue.startsWith("A")) {
         setForeground(java.awt.Color.white);
         setBackground(java.awt.Color.blue);
      }
      else if (svalue.startsWith("K")) {
         setForeground(java.awt.Color.white);
         setBackground(java.awt.Color.red);
      }
      else {
         /* e ai? o que fazer? */
      }

      protected void firePropertyChange(String propertyName, Object oldValue, Object newValue) {}
      public void firePropertyChange(String propertyName, boolean oldValue, boolean newValue) {}
}

Será que é isso?

E

Imagina cara, não é abuso nenhum, afinal vc tem me ajudado bastante.

E sobre o lance de pintar a linha toda, vc viu como estou fazendo?

brlima

pra pintar a linha toda , verifica se a linha é a linha selecionada, ja que vc tem referencia a jTable:

if( table.getRowSelected() == row ){
   setBackground(Color.BLUE);
}

:smiley:

Criado 29 de junho de 2004
Ultima resposta 29 de jun. de 2004
Respostas 11
Participantes 4