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
09/04/2009
Booooooooooaaaaaaa
Eu não conhecia essa pra trocar o Tab pelo Enter...
Valeu !!!
GOSTEI 0
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
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
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
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
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
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
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
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
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
09/04/2009
Use this ao invés de frame.
O this referencia ao próprio objeto.
GOSTEI 0
Nadia Marques
09/04/2009
Muito obrigada Vitor, deu certo!!
Sds
Nadia
GOSTEI 0
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
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
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
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
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
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
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
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
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
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
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
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
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
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
09/04/2009
Vitor,
você tem toda razão, obrigado pela sua ajuda.
GOSTEI 0
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
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