Trocando TAB por ENTER

Java

09/04/2009

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
Nadia Marques

Nadia Marques

Curtidas 0

Respostas

Vitor Pamplona

Vitor Pamplona

09/04/2009

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
GOSTEI 0
Andre Valdestilhas

Andre Valdestilhas

09/04/2009

Booooooooooaaaaaaa Eu não conhecia essa pra trocar o Tab pelo Enter... Valeu !!!
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

[quote="firmao"]Booooooooooaaaaaaa Eu não conhecia essa pra trocar o Tab pelo Enter... Valeu !!!
Tem coisas que só o Swing faz por você! :P
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

Precisa adicionar os imports:
import java.awt.AWTKeyStroke;
import java.awt.KeyboardFocusManager;
import java.awt.event.KeyEvent;
import java.util.HashSet;
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

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
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

Aí teria que ser assim:
import java.awt.*;
import java.awt.event.*;
import java.util.*;
Ou seja, para cada package e subpackage, vc teria que adicionar um import "global" []s
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

frame é o teu JFrame principal. hum... talvez seja necessário colocar este código em cada tela (JFrame) que você usar.
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

Use this ao invés de frame. O this referencia ao próprio objeto.
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

Muito obrigada Vitor, deu certo!! Sds Nadia
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

[quote="vfpamp"]Use this ao invés de frame. O this referencia ao próprio objeto.
sdfasfasdfasdfasdff
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

[quote="geyond"][quote="vfpamp"]Use this ao invés de frame. O this referencia ao próprio objeto.
sdfasfasdfasdfasdff
safasfasdfasdfasdfasfasfasdf3222222222222222222
GOSTEI 0
Nadia Marques

Nadia Marques

09/04/2009

[quote="vfpamp"][quote="firmao"]Booooooooooaaaaaaa Eu não conhecia essa pra trocar o Tab pelo Enter... Valeu !!!
Tem coisas que só o Swing faz por você! :P
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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

[quote="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 [b]pode[/b] 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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

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.
GOSTEI 0
Revelino Santos

Revelino Santos

09/04/2009

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
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

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:
import java.awt.AWTKeyStroke;
import java.awt.GridLayout;
import java.awt.KeyboardFocusManager;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;
import java.awt.event.KeyEvent;
import java.util.HashSet;

import javax.swing.JButton;
import javax.swing.JFrame;

/**
 * @author Vitor Fernando Pamplona - vitor@babaxp.org
 */
public class EnterTest extends JFrame {
    public EnterTest() {
        this.setBounds(100, 100, 400, 500);
        this.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
        
        // Colocando enter para pular de campo
        HashSet backup = new HashSet(this.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
        HashSet conj = (HashSet) backup.clone();
        conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
        this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);
        
        this.setLayout(new GridLayout(3,1));
        
        JButton bt1 = new JButton("Bt1");
        JButton bt2 = new JButton("Bt2");
        JButton bt3 = new JButton("Bt3");
        
        this.add(bt1);
        this.add(bt2);
        this.add(bt3);
        
        bt1.addActionListener(new MyList());
        bt2.addActionListener(new MyList());
        bt3.addActionListener(new MyList());
        
        bt1.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, backup);
        
        this.setVisible(true);
    }
    
    class MyList implements ActionListener {
        public void actionPerformed(ActionEvent e) {
            System.out.println(((JButton)e.getSource()).getText());
        }
    } 
    
    public static void main(String[] args) {
        new EnterTest();
    }
}
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
GOSTEI 0
Revelino Santos

Revelino Santos

09/04/2009

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.
GOSTEI 0
Revelino Santos

Revelino Santos

09/04/2009

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,
GOSTEI 0
Antonio Carlos

Antonio Carlos

09/04/2009

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!
HashSet backup = new HashSet(this.getFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS));
       HashSet conj = (HashSet) backup.clone();
        conj.add(AWTKeyStroke.getAWTKeyStroke(KeyEvent.VK_ENTER, 0));
       this.setFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, conj);
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

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.
GOSTEI 0
Antonio Carlos

Antonio Carlos

09/04/2009

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.
GOSTEI 0
Vitor Pamplona

Vitor Pamplona

09/04/2009

Então tenta acionar o botão com enter nesse exemplo:
import java.awt.BorderLayout;
import java.awt.event.ActionEvent;
import java.awt.event.ActionListener;

import javax.swing.JButton;
import javax.swing.JFrame;
import javax.swing.JOptionPane;


public class ButtonTest  {
	public static void main(String[] args) {
		final JFrame teste = new JFrame("TESTE");
		teste.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);
		teste.setBounds(100,100,200,200);
		teste.setVisible(true);
		
		JButton button = new JButton("TENTE!");
		button.addActionListener(new ActionListener() {
			public void actionPerformed(ActionEvent arg0) {
				JOptionPane.showMessageDialog(teste, "OK");				
			}
		} );
		
		teste.setLayout(new BorderLayout());
		teste.add(button, BorderLayout.CENTER);
		button.requestFocus();
		
		teste.validate();
	}
}

GOSTEI 0
Antonio Carlos

Antonio Carlos

09/04/2009

Vitor, você tem toda razão, obrigado pela sua ajuda.
GOSTEI 0
Ramiro Pamponet

Ramiro Pamponet

09/04/2009

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.
GOSTEI 0
Ramiro Pamponet

Ramiro Pamponet

09/04/2009

[quote="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 [color=#008800]setDefaultFocusTraversalKeys[/color] do [color=#008800]java.awt.KeyboardFocusManager[/color]. Exemplo:
        KeyboardFocusManager manager = KeyboardFocusManager.getCurrentKeyboardFocusManager();
        Set<AWTKeyStroke> keystrokes = new HashSet<>();
        keystrokes.add(AWTKeyStroke.getAWTKeyStroke("pressed TAB"));
        keystrokes.add(AWTKeyStroke.getAWTKeyStroke("pressed ENTER"));
        manager.setDefaultFocusTraversalKeys(KeyboardFocusManager.FORWARD_TRAVERSAL_KEYS, keystrokes);
2 - é [i]só[/i] manipular o [color=#008800]InputMap [/color](WHEN_ANCESTOR_OF_FOCUSED_COMPONENT) da [color=#008800]JTable[/color]. Remova os [color=#008800]KeyStroke[/color]s "pressed ENTER", "shift pressed ENTER", "pressed TAB" e "shift pressed TAB" do mapa e dos [color=#008800]Parent[/color]s dele. Exemplo:
        InputMap inputMap = table.getInputMap(JTable.WHEN_ANCESTOR_OF_FOCUSED_COMPONENT);
        while (inputMap != null) {
            inputMap.remove(KeyStroke.getKeyStroke("pressed ENTER"));
            inputMap.remove(KeyStroke.getKeyStroke("shift pressed ENTER"));
            ...
            inputMap = inputMap.getParent();
        }
[i](ou adiciona uma String vazia para cada um desses [color=#008800]KeyStroke[/color]s no mapa)[/i]
GOSTEI 0
POSTAR