Text Field e Focus. [RESOLVIDO]

Como posso saber se um componente, no caso JTextField tem foco?

O meu problema é o seguinte:
Tenho uma tabela(JTable) com um renderer que implementa um toolTipText em todas as linhas
de uma certa coluna, até ai tudo bem. Quando executo e seleciono uma linha da minha tabela
aquela célula que tem o renderer no caso um JTextField dentro da célula não fica com o “fundo”
colorido, indicando assim que está selecionada.
Preciso saber como fazer o:

if textfield.TEMFOCO(true) textfield.setBackground(FundoTextFieldColor); else textfield.setBackground(Color.white);

O Component tem um método lá chamado isFocusOwner():

Nunca testei, mas acho que isso funciona:

JTextField jtf = new JTextField();
...
if (jtf.isFocusOwner()){
   doSomeMagic();
}

Testa e vê se dá

[]'s

Não deu.
Esse é o meu renderer e onde coloquei o cod:

[code]
class RendererTabela extends DefaultTableCellRenderer{

    @Override
    public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column )
    {
        JTextField tf = new JTextField( value.toString() );
        tf.setOpaque( true );
        tf.setForeground( Color.BLACK );
        tf.setBorder(noFocusBorder);

        tf.setToolTipText(value.toString());
        if(tf.isFocusOwner()){ //se tf tiver foco
        tf.setBackground(FundoTextFieldColor);
        }else{
          tf.setBackground(Color.white);
        }
        return tf;
    }
}[/code]

É, realmente achei que não fosse funcionar =P

Tens que registrar um listener, então, pra saber quando o foco muda de status.

txf.addFocusListener(new FocusAdapter() {
            public void focusGained(final FocusEvent e) {
                //seta a cor "ativada"
            }
            public void focusLost(final FocusEvent e) {
                //seta a cor "desativada"
            }
        });

Ficou assim:

[code] class RendererTabela extends DefaultTableCellRenderer{

    @Override
    public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column )
    {
       final  JTextField tf = new JTextField( value.toString() );

        tf.addFocusListener(new FocusAdapter() {
        public void focusGained(final FocusEvent e) {
            //seta a cor "ativada"
            tf.setBackground(FundoTextFieldColor);
        }
        public void focusLost(final FocusEvent e) {
            //seta a cor "desativada"
            tf.setBackground(Color.white);
        }
    });

        tf.setOpaque( true );
        tf.setForeground( Color.BLACK );
        tf.setBorder(noFocusBorder);

        tf.setToolTipText(value.toString());
     
        return tf;
    }
}

[/code]

Mesmo assim não funciona, é como se quando eu clicasse com o mouse em cima daquela célula ele selecionasse(desse foco) para o componente em baixo(Quando digo em baixo é porque esse renderer cria um textField dentro da célula da tabela e parece que ele não seleciona este componente e sim apenas a célula da tabela). Mas para eu poder dar a “ilusão” de seleção, preciso que mude a cor de fundo do textField que está por cima.
Mais alguma idéia?

Olá

Acho que o problema está em voce sempre criar um novo textField.
O Renderer deve usar apenas uma instancia do Componente apenas para pintar na tela.


              final  JTextField tf = new JTextField();  
    class RendererTabela extends DefaultTableCellRenderer{  
      
           @Override  
           public Component getTableCellRendererComponent( JTable table, Object value, boolean isSelected, boolean hasFocus, int row, int column )  
           {  

                 tf.setText(value);
               tf.addFocusListener(new FocusAdapter() {  
               public void focusGained(final FocusEvent e) {  
                  //seta a cor "ativada"  
                  tf.setBackground(FundoTextFieldColor);  
              }  
              public void focusLost(final FocusEvent e) {  
                  //seta a cor "desativada"  
                  tf.setBackground(Color.white);  
              }  
          });  
     
              tf.setOpaque( true );  
              tf.setForeground( Color.BLACK );  
              tf.setBorder(noFocusBorder);  
     
              tf.setToolTipText(value.toString());  
             
              return tf;  
          }  
      }  

Não deu certo.
Acho que estou esquecendo de declarar alguma propriedade do JTextField, só pode.
Estranho que se eu clico duas vezes para alterar este campo ele altera normal, mas não consigo dizer que quando clico na linha
que ele se encontra ou na célula que ele se encontra é para ficar com fundo de selecionado ( tf.setBackground(FundoTextFieldColor); )
*FundoTextFieldColor é uma cor que criei, ja testei e ela funciona.
Agora… como posso dizer para trocar o fundo deste JTextField quando a linha dele está selecionada?

Olá!

Chama o repaint() no componente depois que voce mudar a cor.

Nops…
tens e-mail pra eu te mandar a imagem do que acontece?
talvez se tu ver tu entenda.

Olá,

O CellRenderer é usado apenas para desenhar o componente.
No caso, teremos que usar o TableCellEditor
Criei uma classe como exemplo.

/**
 *
 * @author marciliosouza
 */
public class CellEditor extends AbstractCellEditor implements TableCellEditor{

    JTextField textField = new JTextField();


    public CellEditor()
    {
        listener();
    }

    @Override
    public Component getTableCellEditorComponent(JTable table, Object value, boolean isSelected, int row, int column) {
        
        if(value != null){
             
                textField.setText(value.toString());
                textField.setToolTipText(value.toString());
        }
        return textField;
    }



    public void listener()
    {
        textField.addFocusListener(new FocusAdapter() {
            @Override
            public void focusGained(final FocusEvent e) {
                //seta a cor "ativada"
                textField.setBackground(Color.CYAN);
            }
            @Override
            public void focusLost(final FocusEvent e) {
                //seta a cor "desativada"
                textField.setBackground(Color.GREEN);
            }

        });
    }

        @Override
        public Object getCellEditorValue() {
            return textField.getText();
        }
}

Na sua classe, faça:

       tbAtendimento.getColumnModel().getColumn( 4 ).setCellEditor(new CellEditor());  

abraço!