Pessoal, gostaria de saber se existe uma forma de saber em qual componente da tela o meu focus está. Digamos que eu tenha vários JtextFields na tela e quero saber em qual deles está o cursor, para assim gerar um evento, como devo proceder?
http://docs.oracle.com/javase/tutorial/uiswing/events/focuslistener.html
http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html
Desconfio que seu problema de focus, na verdade, é para validação. Se for isso, você precisa usar um InputVerifier:
http://docs.oracle.com/javase/tutorial/uiswing/misc/focus.html#inputVerification
http://docs.oracle.com/javase/7/docs/api/javax/swing/InputVerifier.html
Opa, blz cara?
Acho que não me expressei direito, tenho alguns JtextFields na tela, e preciso saber em qual deles está o cursor, dessa forma eu posso, por exemplo, pintar o background daquele text field selecionado, eu preciso de algo que me dê um retorno de qual text field o cliente selecionou, por isso pensei no cursor.
Ah, você precisa deixar o JTextField que está com o foco com uma borda de cor diferente? Pode derivar uma classe de JTextField que mude a cor da borda se ele estiver com foco. É melhor que você ficar “varrendo” os JTextFields e ver qual deles está com foco.
Isso, a ideia é essa, mas não estou sabendo como fazer para descobrir em qual text field meu focus está. Tem algum método pra ver isso?
Tente rodar o exemplo abaixo. É bem tosco, mas…
package guj;
import java.awt.Color;
public class ExemploJTextFieldComFoco extends JFrame {
static class PaintFocusedJTextFieldFocusListener implements FocusListener {
@Override
public void focusGained(FocusEvent e) {
if (e.getSource() instanceof JTextComponent) {
((JTextComponent) e.getSource()).setBackground(Color.RED);
}
}
@Override
public void focusLost(FocusEvent e) {
if (e.getSource() instanceof JTextComponent) {
((JTextComponent) e.getSource()).setBackground(Color.WHITE);
}
}
}
private JTextField txt03;
private JTextField txt02;
private JTextField txt01;
private JTextField txt04;
private JTextField txt05;
private JTextField txt06;
private PaintFocusedJTextFieldFocusListener pftf = new PaintFocusedJTextFieldFocusListener();
/**
* Launch the application.
*/
public static void main(String[] args) {
EventQueue.invokeLater(new Runnable() {
public void run() {
try {
ExemploJTextFieldComFoco frame = new ExemploJTextFieldComFoco();
frame.setVisible(true);
} catch (Exception e) {
e.printStackTrace();
}
}
});
}
/**
* Create the frame.
*/
public ExemploJTextFieldComFoco() {
setBounds(100, 100, 450, 300);
setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
getContentPane().setLayout(new FlowLayout(FlowLayout.CENTER, 5, 5));
getContentPane().add(getTxt01());
getContentPane().add(getTxt02());
getContentPane().add(getTxt03());
getContentPane().add(getTxt04());
getContentPane().add(getTxt05());
getContentPane().add(getTxt06());
getTxt01().addFocusListener(pftf);
getTxt02().addFocusListener(pftf);
getTxt03().addFocusListener(pftf);
getTxt04().addFocusListener(pftf);
getTxt05().addFocusListener(pftf);
getTxt06().addFocusListener(pftf);
}
private JTextField getTxt03() {
if (txt03 == null) {
txt03 = new JTextField();
txt03.setColumns(10);
}
return txt03;
}
private JTextField getTxt02() {
if (txt02 == null) {
txt02 = new JTextField();
txt02.setColumns(10);
}
return txt02;
}
private JTextField getTxt01() {
if (txt01 == null) {
txt01 = new JTextField();
txt01.setColumns(10);
}
return txt01;
}
private JTextField getTxt04() {
if (txt04 == null) {
txt04 = new JTextField();
txt04.setColumns(10);
}
return txt04;
}
private JTextField getTxt05() {
if (txt05 == null) {
txt05 = new JTextField();
txt05.setColumns(10);
}
return txt05;
}
private JTextField getTxt06() {
if (txt06 == null) {
txt06 = new JTextField();
txt06.setColumns(10);
}
return txt06;
}
}
Valeu mesmo cara! Era o que eu estava precisando mesmo ;D