Pessoal, que coisa, estou virando um caçador de BUG`S, só pode ser. Vocês já devem ter percebido, espero que não seja um BUG:
Crio um JFrame;
Adiciona no JFrame um JPainel;
Adiciono no JPanel um JTextField.
Compila, roda…
Como provocar o erro: com o cursor no JTextField, pressione TAB. Como só tem um componente neste painel, perfeito o cursor se mantém no próprio JTextField.
:arrow: AGORA, FAÇA O MESMO só que pressionando SHIFT-TAB e então me responda: onde foi parar o cursor? :roll:
O mesmo acontece com o foco, por exemplo: no lugar do JTextFields, agora adicione um JButton e provoque o erro…
Existe solução? O correto é o cursor/foco ao pressionar SHIFT-TAB se manter no único componente adicionado, assim como ocorre no TAB.
Estive estudando as classes do Swing atrás de possíveis BUG`s, como o método transferFocusBackward()… mas nada concluí.
Você tem só um componente (JTextField ou JButton ou um outro qualquer), e quando aperta TAB vai o focus para o componente, mas quando aperta SHIFT+TAB nenhum componente fica com focus :?:
Não será porque você só tem um único componente que aceita focus :?:
[quote=InicianteJavaHenrique]Deixa eu vê se entendi…
Você tem só um componente (JTextField ou JButton ou um outro qualquer), e quando aperta TAB vai o focus para o componente, mas quando aperta SHIFT+TAB nenhum componente fica com focus :?: [/quote]
Isso mesmo, entendeu certinho!
De fato, só existe um componente. Mas, veja bem: se apertar TAB, o cursor continua lá no componente, firme e forte, afinal não existe outro “componente próximo” para ganhar o foco. O mesmo deveria acontecer ao pressionar SHIFT+TAB, o foco deveria continuar no mesmo componente, firme e forte, afinal, não existe um “componente antecessor” para ganhar o foco, concorda?
Do mesmo jeito que o TAB é desprezado, o SHIFT+TAB também deveria ser, o que não acontece.
E agora, alguma idéia? PARECE SER UM BUG!
Mas, inicialmente, quando vc abre o JFrame, ele já está com o foco no único componente :?:
Pq caso não esteja, ai eu tbm não sei onde está o foco inicialmente , pode ser que quando aperta SHIFT+TAB o foco volta para este lugar misterioso, eu acho
Pode ser um bug, para perceber este tem que ser bem perspicaz :thumbup:
Este “bug” não chega atrapalhar, né :?: Mas mesmo assim pode ser um bug.
cara, posso ta falando uma baita bobagem (eu não sou muuito entendido de swing), mas acho que quando tu aperta SHIFT + TAB o focus vai pro frame. Como se tivesse na raiz do frame e não num componente que esteja nele. Não tenho certeza, mas acho que é isso.
Então… eu também logo imaginei isso. Porém, se apertar TAB depois que o foco está no frame, ele deveria voltar para o componente, coisa que não ocorre.
É estranho mesmo, não consigo achar resposta para tal… obrigado por estar ajudando.
que layout vc está usando?
aqui funciona perfeitamente, com tab ele avança um componente e com o shift+tab ele retorna para o componente anterior.
testei em um frame com o layout GridBagLayout.
[quote=yhhik]que layout vc está usando?
aqui funciona perfeitamente, com tab ele avança um componente e com o shift+tab ele retorna para o componente anterior.
testei em um frame com o layout GridBagLayout.[/quote]
Sim sim… quando existem dois componentes adicionados ao layout, ele funciona certinho.
Mas, faça o teste como citei na primeira postagem…
[quote]- Crio um JFrame;
Adiciona no JFrame um JPainel;
Adiciono no JPanel um JTextField.
Compila, roda…
Como provocar o erro: com o cursor no JTextField, pressione TAB. Como só tem um componente neste painel, perfeito o cursor se mantém no próprio JTextField.
AGORA, FAÇA O MESMO só que pressionando SHIFT-TAB e então me responda: onde foi parar o cursor?
[/quote]
Com um único componente, se apertar SHIFT-TAB para onde vai o foco e o que prova que ele está lá?
Só para ilustrar aos senhores que vem tentando colaborar, só posso definir este caso como um outro BUG existente no Swing. Vejam o código da classe Component (java.awt.Component) e vá direto ao método transferFocusBackward() (linha 7889) :idea:
Perceba que em determinado teste if (linha 7903) por não ter um componente anterior disponível para receber o foco A NÃO SER ELE MESMO no container rootAncestor ele pega sempre o mesmo Container (de FocusTraversalPolicy) e solicita o método getComponentAfter(Container cont, Component comp) que retorna o mesmo componente inicial sempre, entrando em um teste tipo LOOP de ínfinitas vezes e por isso o foco “evapora”, afinal, seu computador está sem parar tentando achar um componente que não existe para receber o foco. Como prova, se você minimizar e depois restaurar sua JFrame, o foco retorna ao primeiro componente, claro, porque o método de FocusTraversalPolicy chamado nesse caso é o getDefaultComponent(Container focusCycleRoot) que é dotado em colocar o foco no componente default somente.
Está aí um problema que Arthur van Hoff e Sami Shaio, autores da classe Component, não perceberam.