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);
Tens que registrar um listener, então, pra saber quando o foco muda de status.
txf.addFocusListener(newFocusAdapter(){publicvoidfocusGained(finalFocusEvente){//seta a cor "ativada"}publicvoidfocusLost(finalFocusEvente){//seta a cor "desativada"}});
vini.roggia
Ficou assim:
classRendererTabelaextendsDefaultTableCellRenderer{@OverridepublicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanisSelected,booleanhasFocus,introw,intcolumn){finalJTextFieldtf=newJTextField(value.toString());tf.addFocusListener(newFocusAdapter(){publicvoidfocusGained(finalFocusEvente){//seta a cor "ativada"tf.setBackground(FundoTextFieldColor);}publicvoidfocusLost(finalFocusEvente){//seta a cor "desativada"tf.setBackground(Color.white);}});tf.setOpaque(true);tf.setForeground(Color.BLACK);tf.setBorder(noFocusBorder);tf.setToolTipText(value.toString());returntf;}}
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.
finalJTextFieldtf=newJTextField();classRendererTabelaextendsDefaultTableCellRenderer{@OverridepublicComponentgetTableCellRendererComponent(JTabletable,Objectvalue,booleanisSelected,booleanhasFocus,introw,intcolumn){tf.setText(value);tf.addFocusListener(newFocusAdapter(){publicvoidfocusGained(finalFocusEvente){//seta a cor "ativada" tf.setBackground(FundoTextFieldColor);}publicvoidfocusLost(finalFocusEvente){//seta a cor "desativada" tf.setBackground(Color.white);}});tf.setOpaque(true);tf.setForeground(Color.BLACK);tf.setBorder(noFocusBorder);tf.setToolTipText(value.toString());returntf;}}
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 */publicclassCellEditorextendsAbstractCellEditorimplementsTableCellEditor{JTextFieldtextField=newJTextField();publicCellEditor(){listener();}@OverridepublicComponentgetTableCellEditorComponent(JTabletable,Objectvalue,booleanisSelected,introw,intcolumn){if(value!=null){textField.setText(value.toString());textField.setToolTipText(value.toString());}returntextField;}publicvoidlistener(){textField.addFocusListener(newFocusAdapter(){@OverridepublicvoidfocusGained(finalFocusEvente){//seta a cor "ativada"textField.setBackground(Color.CYAN);}@OverridepublicvoidfocusLost(finalFocusEvente){//seta a cor "desativada"textField.setBackground(Color.GREEN);}});}@OverridepublicObjectgetCellEditorValue(){returntextField.getText();}}