Um componente: se apertar TAB, ok. Mas se apertar SHIFT-TAB... xííí!

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í.

Boa noite, boa sorte! :wink:

Ninguém mesmo? Caso sem solução?

Desculpem, juro que é a última vez que tento obter a resposta neste tópico: Ninguém mesmo, raridade a pergunta?

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 :?:

Não será porque você só tem um único componente que aceita focus :?: :smiley:

[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! :slight_smile:

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!

Abração, obrigado por estar colaborando.

Sim. Concordo, faz sentido isto que vc falou. :smiley:

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 :wink:, pode ser que quando aperta SHIFT+TAB o foco volta para este lugar misterioso, eu acho :slight_smile:

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á?

Obrigado por estar ajudando! :wink:

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.

Saúde a todos, muito sucesso.