Text Field e Focus. [RESOLVIDO]

9 respostas
vini.roggia

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);

9 Respostas

Preco

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

vini.roggia
Não deu. Esse é o meu renderer e onde coloquei o cod:
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;
        }
    }
Preco

É, 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"
            }
        });
vini.roggia
Ficou assim:
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;
        }
    }

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?

Marck

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;  
          }  
      }
vini.roggia

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?

Marck

Olá!

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

vini.roggia

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

Marck

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!

Criado 26 de junho de 2009
Ultima resposta 29 de jun. de 2009
Respostas 9
Participantes 3