Página Inicial do Fórum > GUI - (Applets, Swing, SWT, etc)

Trocando TAB por ENTER



Criar novo tópico   Responder tópico


  1. ntsmarques
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Sou novata em Java, entrei agora no portal javafree e vi esse código abaixo. Gostaria de tirar algumas dúvidas, se for possível: aonde devo colocar esse código? Inseri no inicio da minha classe e deu erro na variável frame, vcs poderiam me dizer o que é?
    Gostaria de, para passar de um campo ao outro do formulário, apertar ENTER ao invés de TAB, mas sem colocar o código em cada FocusLost..


    // Colocando enter para pular de campo
    HashSet conj = new HashSet(frame.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
    conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
    frame.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);


    Sds
    Nadia



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Fala Nadia,

    Vc pode colocar no ponto de inicialização do sistema. Já que, ao executar este código, o sistema inteiro será alterado.

    []s
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. firmao
    Posts:365


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Booooooooooaaaaaaa
    Eu não conhecia essa pra trocar o Tab pelo Enter...

    Valeu !!!
    _________________
    Andre Valdestilhas

    SCJP, SCWCD
    JavaFree.org



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    firmao
    Booooooooooaaaaaaa
    Eu não conhecia essa pra trocar o Tab pelo Enter...

    Valeu !!!



    Tem coisas que só o Swing faz por você!
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. ntsmarques
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Oi Vitor, eu coloquei o código no início da classe, mas dá erro na classe HashSet diz "Cannot find symbol" e tbm nas variáveis frame e KeyEvent.
    Sds
    Nadia



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Precisa adicionar os imports:



    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. ntsmarques
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Vitor, porque tenho que importar uma classe específica, como por exemplo import java.awt.KeyboardFocusManager;, eu importei como java.awt.*; ele já não deveria funcionar?
    sds
    Nadia



  1. ntsmarques
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Vitor, último problema... dá erro na variável frame, essa variável não faz parte dos métodos das classes? Ou tenho que declará-la? Se tiver declaro como o que?
    Sds
    Nadia



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Aí teria que ser assim:



    Ou seja, para cada package e subpackage, vc teria que adicionar um import "global"

    []s
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. ntsmarques
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Vitor, último problema... dá erro na variável frame, essa variável não faz parte dos métodos das classes? Ou tenho que declará-la? Se tiver declaro como o que?
    Sds
    Nadia



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    frame é o teu JFrame principal.

    hum... talvez seja necessário colocar este código em cada tela (JFrame) que você usar.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. ntsmarques
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Mas ele está no Frame. Segue uma parte do código:

    import javax.swing.*;
    import java.sql.*;
    import java.awt.AWTKeyStroke;
    import java.awt.KeyboardFocusManager;
    import java.awt.event.KeyEvent;
    import java.util.HashSet;
    import javax.swing.JFrame;

    public class Produto extends javax.swing.JFrame {

    /** Creates new form Produto */
    public Produto() {
    initComponents();
    setBounds(130,80,670,580);

    // Colocando enter para pular de campo
    HashSet conj = new HashSet(frame.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
    conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
    frame.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);

    .
    .
    .
    E continua dando erro na variável frame...
    Sds
    Nadia



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Use this ao invés de frame.

    O this referencia ao próprio objeto.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. ntsmarques
    Posts:15


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Muito obrigada Vitor, deu certo!!
    Sds
    Nadia



  1. geyond
    Posts:3


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    vfpamp
    Use this ao invés de frame.

    O this referencia ao próprio objeto.


    sdfasfasdfasdfasdff



  1. geyond
    Posts:3


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    geyond
    vfpamp
    Use this ao invés de frame.

    O this referencia ao próprio objeto.


    sdfasfasdfasdfasdff

    safasfasdfasdfasdfasfasfasdf3222222222222222222



  1. Hwoarang
    Posts:86


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    vfpamp
    firmao
    Booooooooooaaaaaaa
    Eu não conhecia essa pra trocar o Tab pelo Enter...

    Valeu !!!



    Tem coisas que só o Swing faz por você!




    Vitor,
    Desculpe minha ignorância, mas esse código é útil quando?
    pois normalmente temos que codificar alguma coisa no ActionPerformed() do campo pra validar ou testar alguma coisa, não?
    acrescentando um nextField.requestFocusInWindow() lá no ActionPerformed() não daria no mesmo?

    ou o código é justamente uma alternativa para o requestFocusInWindow() ?

    vlw

    Hwo



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Hwoarang

    Vitor,
    Desculpe minha ignorância, mas esse código é útil quando?
    pois normalmente temos que codificar alguma coisa no ActionPerformed() do campo pra validar ou testar alguma coisa, não?
    acrescentando um nextField.requestFocusInWindow() lá no ActionPerformed() não daria no mesmo?

    ou o código é justamente uma alternativa para o requestFocusInWindow() ?



    Bom, se você quiser fazer isso em cada componente, até mesmo naqueles que não há evento em actionPerformed, fique a vontade.

    Pelo que eu entendi, vc indica qual será o próximo componente com o nextField. Não esqueça de testar se o próximo componente pode receber o foco, e se está na ordem correta.

    Eu prefiro alterar a tecla para troca de campo que o Swing usa, já que ele dá essa opção. Além de ser mais correto, eu não corro o risco de esquecer alguma coisa e ter que duplicar código por aí. Além do que se o Swing mudar algum tratamento de foco, não vou precisar me preocupar com isso.

    []s
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. Hwoarang
    Posts:86


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    hmmm.
    interessante.

    Vitor, vc poderia me passar o link original onde tem o código?
    grato.

    outra coisa: o código obedece o nextFocusableComponent pra saber pra onde enviar o foco ?

    Hwo



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Esse?

    http://www.javafree.org/javabb/viewtopic.jbb?t=12842


    outra coisa: o código obedece o nextFocusableComponent pra saber pra onde enviar o foco ?



    Eu só alterei a tecla que deve ser considerada como trocadora de campos. O resto o Swing faz.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. revelino
    Posts:5


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Vitor,

    1-Com relação ao ENTER, quando utilizamos o TraversalKeys, na verdade o focus fica pulando conforme ordenamento dos mesmos, agora tem a situação que que o botão não aceita o ENTER para realizar a ação do click e não adianta tratar pelo KeyPress do Frame ou do próprio botão que como está configurado utilizar a tecla ENTER no TraversalKey, o mesmo desconsidera essa tecla para ser tratada no Frame.

    Para resolver esse problema faço o seguinte:

    Botao.setFocusTraversalKeysEnabled(false);

    Para os JTextField que por alguma situação preciso validar, faço a mesma situação e utilizo os eventos do Frame


    Você tem outra solução para esta situação?



    2-JTable, ao teclar ENTER no mesmo ele pula para o próximo registro(Item) que está sendo visualizado

    Você tem alguma idéia para solucionar o item 2?


    Abraços e muito obrigado



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    1 - Mas normalmente o VK_ENTER não aciona o botão. A não ser que você implementou algo do gênero. O default do Swing é acionar o botão quando o VK_SPACE é pressionado.

    Se você quer desabilitar o VK_ENTER nos botões, pode fazer assim:


    Note que só o Bt1 não passa o foco com o VK_ENTER.

    2 - O TAB também não sai do JTable. O Enter assumiu a mesma utilidade do TAB.

    []s
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. revelino
    Posts:5


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Com relação ao ENTER Victor, realmente eu coloquei pra ser assim mesmo, a minha idéia eu o usuário e digitando nos txt e o focus chegando no Botão, se o mesmo teclar ENTER já aciona o evento, isso já fiz, está funcionando super bacana.

    O Meu problema é que tudo está funcionando corretamente, só que a mudança de foco só há se eu utlizar a property NEXTFocus...do componente, se eu colocar o tratamento no KEYPRESS . KEYRelease o mesmo não reconhece, pois, pelo que vi ao iniciar o TravessalKey, só vai passar pelos KEYPR..da vida , quando eu mudar a propriedade do TravessalFocus para false, essa foi a solução encontrada, você teria outra idéia?

    Não sei se me expressei direito, obrigado.




  1. revelino
    Posts:5


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Ah..esqueci de comentar também, com relação JTable, é que ao teclar ENTER o mesmo dar um NEXT no banco de dados e sair da JTable(Normal, já que substituiu o ENTER), só que o quero é teclar ENTER na linha do JTable e o mesmo não pular o REGISTRO(List)


    Abraços,



  1. AC
    Posts:11


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Caros,
    Eu utilizei o código abaixo para trocar a ação do TAB pelo ENTER no formulário e funcionou bem.
    O problema é que quando ele encontra um botão ele não consegue fazer com que ele funcione com a tecla ENTER. Quando o enter é pressionado, ele simplesmente muda o foco.
    Alguém poderia me ajudar a contornar esse problema, de maneira que o botão seja acionado quando for pressionada a tecla Enter?

    Desde já obrigado!

    _________________
    Nunca é tarde para aprender...



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Pelo que eu me lembro (Já to esquecendo ) o ENTER não aciona nenhum evento de action dos botões, independente se você trocou enter por tab ou não. Somente o SPACE ativa as actions.
    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. AC
    Posts:11


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Vitor,

    quando eu não utilizo o código para substituir o TAB pelo ENTER, quando o focu está no botão, o evento é acionado via Enter.
    Só deixa de ocorrer quando eu implemento a mudança.
    No caso de executar a mudança dos campos via TAB, não há problema algum de acionar via Enter.
    _________________
    Nunca é tarde para aprender...



  1. vfpamp
    Posts:6098


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Então tenta acionar o botão com enter nesse exemplo:




    _________________
    Vitor Pamplona
    http://vitorpamplona.com
    @vitorpamplona



  1. AC
    Posts:11


    Comment Arrow

    Publicado em: 09/04/2009 23:18:44

    Vitor,

    você tem toda razão, obrigado pela sua ajuda.
    _________________
    Nunca é tarde para aprender...



  1. rolipam
    Posts:12


    Comment Arrow

    Publicado em: 14/03/2012 10:44:52

    Gente Tô com uma grande Dúvida!!!!

    1. É possível manter a mudança do foco dos componentes de uma tela utilizando ENTER e/ou TAB (e não apenas um dos dois)? Como implementar esse código?

    2. No caso de uma JTable, gostaria de desabilitar o ENTER e o TAB para Navegar pelos Registros (deixando apenas as setas Acima e Abaixo habilitadas) e qdo teclar ENTER selecionar o registro, setar os valores em TextFields e Perder o Foco para o próximo componente, como um botão para imprimir por exemplo.



  1. simu
    Posts:9417


    Comment Arrow

    Publicado em: 14/03/2012 14:24:06

    rolipam
    Gente Tô com uma grande Dúvida!!!!

    1. É possível manter a mudança do foco dos componentes de uma tela utilizando ENTER e/ou TAB (e não apenas um dos dois)? Como implementar esse código?

    2. No caso de uma JTable, gostaria de desabilitar o ENTER e o TAB para Navegar pelos Registros (deixando apenas as setas Acima e Abaixo habilitadas) e qdo teclar ENTER selecionar o registro, setar os valores em TextFields e Perder o Foco para o próximo componente, como um botão para imprimir por exemplo.



    1 - É possível sim. Usando o método setDefaultFocusTraversalKeys do java.awt.KeyboardFocusManager.
    Exemplo:

    2 - é manipular o InputMap (WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) da JTable. Remova os KeyStrokes "pressed ENTER", "shift pressed ENTER", "pressed TAB" e "shift pressed TAB" do mapa e dos Parents dele.
    Exemplo:(ou adiciona uma String vazia para cada um desses KeyStrokes no mapa)
    _________________
      Nome real: Carlos F. Heuberger

    Removeram os meus direitos de administrador e moderador - sem aviso, pela segunda vez - contate o ombudsman (?), a equipejavafree ou a "alta gerência" se necessário - Que pena... que terminou dessa maneira!

    "The mod javafree deserves, but not the one it needs right now."
    --------------------
    Não leio nem respondo MPs!
    This posting is provided AS IS with no warranties and confers no rights.



  1. Relacionados





Novo tópico   Responder tópico     Índice do forum -> GUI - (Applets, Swing, SWT, etc)